Hooks 和 Redux Saga

12

我正在学习redux hooks,并想知道如何与redux saga一起使用。

目前saga中编写的代码如下。

centers.js

componentDidMount() {
    this.props.getCenters();
  }

...

<tbody>
                            {
                              this.props.centers ?
                                <React.Fragment>
                                  {
                                    centers.map((center, index) =>
                                      <tr key={index}>
                                        <td>{center.name}</td>
                                        <td>{center.zip}</td>
                                      </tr>
                                    )
                                  }
                                </React.Fragment>
                              :
                                <tr>
                                  <td> No data available</td>
                                </tr>

                            }
                          </tbody>

操作文件定义如下。

export const getCenters = () => ({
  type: types.CENTERS_REQUEST,
});

saga文件的定义如下。

import { DEFAULT_ERROR_MSG } from '../../constants';
import { instance as centerProvider } from '../services/centerProvider';

function* fetchCenters() {
  try {
    const response = yield call(centerProvider.getCenters);
    const centers = response.data.data.centers;

    // dispatch a success action to the store
    yield put({ type: types.CENTERS_SUCCESS, centers});

  } catch (error) {
    // dispatch a failure action to the store with the error
    yield put(DEFAULT_ERROR_MSG);
  }
}

export function* watchCenterRequest() {
  yield takeLatest(types.CENTERS_REQUEST, fetchCenters);
}

export default function* centerSaga() {
  yield all([
    watchCenterRequest()
  ]);
}

那么问题是,

  • 如果使用hooks,我们是否仍需要redux?
  • 如何使用hooks重写上面的代码?
1个回答

15
  1. "如果我们使用hooks,我们还需要redux吗?"

如果你愿意,可以使用useReducer hook代替redux。但是,如果您在DOM树的不同分支中有不同组件之间共享状态,则使用useReducer实现可能有点复杂。因此,使用redux和saga并不与hooks相矛盾。Hooks只是在更喜欢函数组件而非类组件时需要使用。

  1. "如何使用hooks重写上述代码?"

您可以将类组件Centers改成函数组件,像这样:

function Centers(props) {
    useEffect(() => {
        props.getCenters();
    }, []);

    return (
        //render what you need here
    );
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接