javascript - 创建 Redux-saga 监听器

标签 javascript reactjs redux redux-saga

我对 redux saga 有一个 UPDATE_DATE 操作。 我想在每次修改日期时更新多个资源。我想实现一个监听器来触发回调的 UPDATE_DATE_SUCCESS 操作。任何想法?如果我可以从 React 组件中调用它,那就太好了。

行动: 更新日期 UPDATE_DATE_SUCCESS UPDATE_DATE_FAILURE

export const {
  updateDate,
  OnDateChange,
} = createActions({
  [ActionTypes.UPDATE_DATE]: (date) => date,
});

传奇

export function* updateDate(newDate) {
  console.log('from sagas to reducer', newDate); // eslint-disable-line no-console
  try {
    yield put({
      type: ActionTypes.UPDATE_DATE_SUCCESS,
      payload: newDate,
    });
  } catch (err) {
    /* istanbul ignore next */
    yield put({
      type: ActionTypes.UPDATE_DATE_FAILURE,
      payload: err,
    });
  }
}

export default function* root() {
  yield all([
    takeLatest(ActionTypes.UPDATE_DATE, updateDate),
    takeEvery(ActionTypes.UPDATE_DATE_SUCCESS, test),
  ]);
}

React 组件的理想实现

  componentDidMount() {
    const { dispatch } = this.props;

    dispatch(onDateChange((newDate) => {
        dispatch(getApps(newDate));
        dispatch(getPlatforms(newDate));
        dispatch(getNetworks(newDate));
        dispatch(getCountries(newDate));
        dispatch(getFormats(newDate));
        dispatch(getDevices(newDate));
        dispatch(getNetworkKeys(newDate));
    }));
  }

有什么帮助吗?谢谢!

最佳答案

Redux Sagas 背后的想法是处理 Saga 上而不是组件中的操作/事件的副作用。 我认为这样做的方法是这样的(注意片段代码未经测试,仅将其用作引用/示例):

// --> Saga <-- //
import { getApps, getPlatforms, getNetworks, getCountries, getFormats, getDevices, getNetworkKeys } from './actions.js';

export function* updateDateWatcher(action) {
  const { payload: newDate } = action;
  if (!newDate) return;

  try {
    // dispatch all required actions
    yield all([
      put(getApps(newDate),
      put(getPlatforms(newDate),
      put(getNetworks(newDate)),
      put(getCountries(newDate)),
      put(getFormats(newDate)),
      put(getDevices(newDate)),
      put(getNetworkKeys(newDate)),
    ]);
    // then trigger a success action if you want to
    yield put(updateDataSuccess());
  } catch (err) {
    // if something wrong happens in the try this will trigger 
    yield put(updateDateFailure(err));
  }
}

export default function* root() {
  yield all([
    takeLatest(ActionTypes.UPDATE_DATE, updateDateWatcher),
  ]);
}


// --> Component <-- //
import { updateDate } from './actions.js';

class MyComponent extends Component {
  componentDidMount() {
    const { onDateChange } = this.props;
    const date = new Date();
    onDateChange(date); // -> triggers ActionTypes.UPDATE_DATE
  }
}

const mapDispatchToProps = dispatch => ({
  onDateChange: (newDate) => dispatch(updateDate(newDate)),
});

export default connect(null, mapDispatchToProps)(MyComponent);

关于javascript - 创建 Redux-saga 监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53956593/

相关文章:

javascript - 在 React.js 中调用同一页面中的多个组件

javascript - Kendo MVC Grid - 未触发 NumericTextBox Change 事件

javascript - 使用自己的方法创建函数

javascript - 如何动态创建带有Tags的组件?

javascript - 为什么 React 组件会在每次 useEffect 依赖项更改时卸载?

javascript - 如何更新组件安装路径?

reactjs - 获取 window.scroll 上的 redux 状态

javascript - 在递归方法中将数组设置为 null

javascript - 是否可以只用 Angular 将数据写入本地 json 文件?

javascript - React 单选输入仅在单击标签时发生变化