Javascript Redux传奇在不经过传奇的情况下进行了更新
我是传奇世界的新手。虽然我在Javascript Redux传奇在不经过传奇的情况下进行了更新,javascript,reactjs,redux,redux-saga,Javascript,Reactjs,Redux,Redux Saga,我是传奇世界的新手。虽然我在react nativeterritory上与thunk合作过,但我现在非常困惑。我正在努力使我的项目的框架,我希望得到非常大的很快。考虑到这一点,我正试图将逻辑分割成多个文件 我已经让减速器点火了,只是它不是我想要的方式。我甚至不知道这是怎么发生的。我的传奇故事没有发生,但是我的状态更新了。我从我的reducer中看到了控制台日志,但从saga watcher函数中看不到任何内容。我应该换什么 Index.js reducers/metastatereducer.j
react native
territory上与thunk
合作过,但我现在非常困惑。我正在努力使我的项目的框架,我希望得到非常大的很快。考虑到这一点,我正试图将逻辑分割成多个文件
我已经让减速器点火了,只是它不是我想要的方式。我甚至不知道这是怎么发生的。我的传奇故事没有发生,但是我的状态更新了。我从我的reducer中看到了控制台日志,但从saga watcher函数中看不到任何内容。我应该换什么
Index.js
reducers/metastatereducer.js
actions/metaStateActions.js
actions/index.js
sagas/metastatesagas.js
传奇/索引
redux saga
总是在尝试自行处理之前将操作传递给存储。因此,还原程序总是在任何saga行为执行之前运行
我认为错误在于您的
metaStateSagas
数组需要使用takeEvery
,而不是take
,但我不能完全确定。试试看它是否能解决问题。谢谢您的回复。不过我很困惑。为什么它在传奇故事之前运行减速器?如果我需要更新值,然后更新状态,该怎么办?我将它改为takeEvery,现在我的传奇触发了第一个控制台日志,但仅此而已。中间件就是这样实现的-请参阅。这也意味着任何yield select()
效果都使用最新状态。至于你的传奇,你真的把{type:“SET_FILE_EXTENSION”}
发送到任何地方了吗?你的传奇故事被暂停,等待行动被发送,然后才继续。啊,我想我现在明白了。我在我的操作中使用takeEvery(“设置文件扩展名”,watchFileExtension),
,在watchFileExtension
saga中,我在同一设置文件扩展名
上使用take
。我想我应该使用类似于TAKE\u FILE\u EXTENSION
的方法来获取值,然后在我的saga中使用put('SET\u FILE\u EXTENSION')
来更新reducer中的状态。对吗?因为我想我正在发送SET\u FILE\u EXTENSION
,这就是我的传奇故事如何展开的,但在它里面,我正在等待与take采取相同的行动。类似的事情,是的。我要说的是,我不确定你所尝试的是否真的是一个很好的传奇案例。如果你需要做的就是在状态中更新一个值,你不需要在第一个位置中间有一个故事。我只是想让基础开始。我将采取一个csv文件,使用papaparse读取标题(如果适用),让客户端调整ui内的布局,将值插入数据库,创建新表(如果需要),等等。它将变得越来越大。会有下拉列表,但我也需要做大量的ajaxing。我不想走恶作剧的路线,因为它让我在上一个项目中发疯。我不得不多次重组。我真的很感谢你的帮助。如果你有任何建议,请告诉我。
import React from 'react'
import { render } from 'react-dom'
import { createStore, applyMiddleware } from 'redux'
import createSagaMiddleware from 'redux-saga'
import { Provider } from 'react-redux'
import reducer from './reducers'
import rootSaga from './sagas'
import App from './App'
const sagaMiddleware = createSagaMiddleware()
const store = createStore(
reducer,
applyMiddleware(sagaMiddleware)
)
sagaMiddleware.run(rootSaga)
render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById("etlRootDiv"),
);
import React, { Component } from 'react'
import { connect } from 'react-redux'
import FileExtensionSelector from './components/FileExtensionSelector'
import { setFileExtension } from './actions'
class App extends Component {
constructor(props) {
super(props)
}
handleTypeSelect() {
console.log('handle more click');
this.props.setFileExtension('zip');
console.log(this.props);
}
componentWillReceiveProps(nextProps){
console.log(nextProps);
}
render() {
return (
<div>
<FileExtensionSelector onFileTypeSelect={this.handleTypeSelect.bind(this)} />
<div>{this.props.fileType} ...asdasd</div>
</div>
)
}
}
const mapStateToProps = ({ metaState }) => {
const { fileType } = metaState;
return { fileType };
};
const mapDispatchToProps = (dispatch) => ({
setFileExtension(ext) {
dispatch(setFileExtension(ext))
}
})
export default connect(mapStateToProps, mapDispatchToProps)(App)
import { combineReducers } from 'redux';
import metaState from './MetaStateReducer';
const rootReducer = combineReducers({
metaState,
})
export default rootReducer
const INITIAL_STATE = {
fileType: null,
hasHeader: false,
};
export default function (state = INITIAL_STATE, action) {
switch (action.type) {
case 'SET_FILE_EXTENSION':
console.log('/// in set file reducer ///');
console.log(action);
// console.log({ ...state, ...INITIAL_STATE, fileType: action.payload });
return { ...state,...INITIAL_STATE, fileType: action.payload };
default:
return state;
}
}
function action(type, payload = {}) {
return { type, ...payload }
}
export const SET_FILE_EXTENSION = "SET_FILE_EXTENSION";
export const setFileExtension = (extension) => action( SET_FILE_EXTENSION, { payload: extension });
export { setFileExtension, SET_FILE_EXTENSION } from './metaDataActions';
import { take, put } from 'redux-saga/effects'
import { SET_FILE_EXTENSION } from '../actions';
function* watchFileExtension(ext) {
console.log(' --- in watch file ext ---');
const { extension } = yield take(SET_FILE_EXTENSION)
console.log(`set extension is ${extension}`);
// yield put({ type: 'SET_FILE_EXTENSION', payload: ext });
}
export const metaStateSagas = [
take("SET_FILE_EXTENSION", watchFileExtension),
]
import { all } from 'redux-saga/effects'
import { metaStateSagas } from './MetaStateSagas';
export default function* rootSaga() {
yield all([
...metaStateSagas,
])
}