无需反应即可访问 redux
Access redux without react
我想在不使用 React 组件的情况下访问商店(分发和观察)。我已经找了几个小时了,没有结果。
是这样的。我在应用程序根目录中创建了商店:
import { Provider } from 'react-redux'
import createStore from './state/store';
let store = createStore();
ReactDOM.render(
<Provider store={store}>
<App>
</Provider>,
document.getElementById('root')
);
我很乐意使用 react-redux
提供的 connect
函数,当我需要在组件中添加动作或监听状态变化时,但当我想在组件外部设置一些逻辑时(主要是派遣)我卡住了。
总之,我想验证一个字段。我想制作一个 validation.js
文件,我可以在其中监听商店的更改、运行 验证逻辑,然后在出现最终错误时分派一个操作。
就商店而言,它不是全局的,我没有使用 React 组件。让 store 监听变化并派发动作的方法是什么?
提前致谢。
我认为您不应该直接从商店收听更改,但您需要它才能分派操作。
聆听变化
在 redux
中,您调用这种逻辑的自然位置是 action
调度字段中的更改。
export function updateSomeField(value, field) {
fieldValidator.validate()
return { type: ActionTypes.UPDATE_SOME_FIELD, field: field, value: value }
}
fieldValidator
可以持有对商店的引用,以获得他需要的状态,以便使用 store.getState()
执行他的逻辑,或者从操作中获取该数据作为参数(使用异步操作的帮助):
export function updateSomeField(value, field) {
return (dispatch, getState) => {
fieldValidator.validate(getState.myScreen.fields)
dispatch({ type: ActionTypes.UPDATE_SOME_FIELD, field: field, value: value })
}
}
获取商店
一旦创建,就可以提供给任何需要它的人。
您可以通过初始化单例来完成
let store = createStore();
FieldValidator.setInstance(new FieldValidator(store));
// FieldValidator.js
class FieldValidator {
...
static _instance = null;
static getInstance() {
return FieldValidator._instance;
}
static setInstance(fieldValidator) {
FieldValidator._instance = fieldValidator;
}
...
}
或者通过注入成员
let store = createStore();
fieldValidator.store = store;
这是我所做的(在创建我的商店之后):
export const dispatch = store.dispatch
然后您可以从代码中的任何地方调用 dispatch
(尽管我几乎只是从事件处理程序中调用)。
如果您使用 Redux-Saga 来管理流程控制,您很少需要使用 dispatch
,除了用于直接用户输入的事件处理程序,因为它将调度包装在其 put
API.
我想在不使用 React 组件的情况下访问商店(分发和观察)。我已经找了几个小时了,没有结果。
是这样的。我在应用程序根目录中创建了商店:
import { Provider } from 'react-redux'
import createStore from './state/store';
let store = createStore();
ReactDOM.render(
<Provider store={store}>
<App>
</Provider>,
document.getElementById('root')
);
我很乐意使用 react-redux
提供的 connect
函数,当我需要在组件中添加动作或监听状态变化时,但当我想在组件外部设置一些逻辑时(主要是派遣)我卡住了。
总之,我想验证一个字段。我想制作一个 validation.js
文件,我可以在其中监听商店的更改、运行 验证逻辑,然后在出现最终错误时分派一个操作。
就商店而言,它不是全局的,我没有使用 React 组件。让 store 监听变化并派发动作的方法是什么?
提前致谢。
我认为您不应该直接从商店收听更改,但您需要它才能分派操作。
聆听变化
在 redux
中,您调用这种逻辑的自然位置是 action
调度字段中的更改。
export function updateSomeField(value, field) {
fieldValidator.validate()
return { type: ActionTypes.UPDATE_SOME_FIELD, field: field, value: value }
}
fieldValidator
可以持有对商店的引用,以获得他需要的状态,以便使用 store.getState()
执行他的逻辑,或者从操作中获取该数据作为参数(使用异步操作的帮助):
export function updateSomeField(value, field) {
return (dispatch, getState) => {
fieldValidator.validate(getState.myScreen.fields)
dispatch({ type: ActionTypes.UPDATE_SOME_FIELD, field: field, value: value })
}
}
获取商店
一旦创建,就可以提供给任何需要它的人。 您可以通过初始化单例来完成
let store = createStore();
FieldValidator.setInstance(new FieldValidator(store));
// FieldValidator.js
class FieldValidator {
...
static _instance = null;
static getInstance() {
return FieldValidator._instance;
}
static setInstance(fieldValidator) {
FieldValidator._instance = fieldValidator;
}
...
}
或者通过注入成员
let store = createStore();
fieldValidator.store = store;
这是我所做的(在创建我的商店之后):
export const dispatch = store.dispatch
然后您可以从代码中的任何地方调用 dispatch
(尽管我几乎只是从事件处理程序中调用)。
如果您使用 Redux-Saga 来管理流程控制,您很少需要使用 dispatch
,除了用于直接用户输入的事件处理程序,因为它将调度包装在其 put
API.