ren*_*kre 1 reactjs redux react-hooks
我正在尝试将Redux集成到现有的React应用程序中。我正在学习redux。我正在使用挂钩。互联网上有许多使用类组件的示例。我找不到如何使用功能组件实现此目的的示例。
下面的代码不会引发错误。但是,内部的动作useEffect
没有被调用。该代码不产生任何输出。我想知道电话是否正确。有什么帮助吗?
Index.js
const store = createStore(rubricReducer, applyMiddleware(thunk));
ReactDOM.render(
<BrowserRouter basename={baseUrl}>
<Provider store={store} > <App /> </Provider>
</BrowserRouter>,
rootElement);
Run Code Online (Sandbox Code Playgroud)
Rubrics.tsx
const mapStateToProps = state => ({
rubrics: state.rubrics.items,
loading: state.rubrics.loading,
error: state.rubrics.error
});
const mapDispatchToProps = (dispatch) => {
return {
getRubrics: () => dispatch(fetchRubrics())
};
}
const Rubrics = (props) => {
const { rubrics, loading, error } = props;
useEffect(() => {
props.dispatch(fetchRubrics());
}, []);
if (error) { return <div>Error! {error.message}</div>; }
if (loading) { return <div>Loading...</div>; }
return (
<ul>
<React.Fragment>
{rubrics.map(rubric => {
return (
<li key={rubric.id}>{rubric.title}</li>
);
})}
</React.Fragment>
</ul>
)
}
export default connect(mapStateToProps, mapDispatchToProps)(Rubrics);
Run Code Online (Sandbox Code Playgroud)
rubricActions.tsx:
export function fetchRubrics() {
return dispatch => {
dispatch(fetchRubricsBegin());
axios.get("api/Rubric/Index")
.then(response => {
console.log('success: reading rubrics');
dispatch(fetchRubricsSuccess(response.data));
return response.data;
})
.catch(error => { fetchRubricsFailure(error) });
};
}
export const FETCH_RUBRICS_BEGIN = "FETCH_RUBRICS_BEGIN";
export const FETCH_RUBRICS_SUCCESS = "FETCH_RUBRICS_SUCCESS";
export const FETCH_RUBRICS_FAILURE = "FETCH_RUBRICS_FAILURE";
const fetchRubricsBegin = () => ({
type: FETCH_RUBRICS_BEGIN
})
const fetchRubricsSuccess= (rubrics) => ({
type: FETCH_RUBRICS_SUCCESS,
payload: { rubrics}
})
const fetchRubricsFailure = (error) => ({
type: FETCH_RUBRICS_FAILURE,
payload: {error}
})
Run Code Online (Sandbox Code Playgroud)
rubricReducer.tsx:
import {
FETCH_RUBRICS_BEGIN,
FETCH_RUBRICS_SUCCESS,
FETCH_RUBRICS_FAILURE
} from '../_actions/rubricActions';
const initialState = {
rubrics: [],
loading: false,
error: null
};
const rubricReducer = (state = initialState, action) => {
switch (action.type) {
case FETCH_RUBRICS_BEGIN:
return {
...state,
loading: true,
error: null
};
case FETCH_RUBRICS_SUCCESS:
return {
...state,
loading: false,
items: action.payload.rubrics
}
case FETCH_RUBRICS_FAILURE:
return {
...state,
loading: false,
error: action.payload.error,
items: []
};
default:
return state;
}
}
export default rubricReducer;
Run Code Online (Sandbox Code Playgroud)
Rüd*_*ulz 17
使用react-redux自 v7.1.0 以来提供的钩子,现在可以不用和来编写。mapStateToProps
mapDispatchToProps
import React, { useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';
const Rubrics = () => {
const dispatch = useDispatch();
const { rubrics, loading, error } = useSelector(
state => ({
error: state.error,
rubrics: state.rubrics,
loading: state.loading
})
);
useEffect(() => {
dispatch(fetchRubrics());
}, [dispatch]);
if (error) { return <div>Error! {error.message}</div>; }
if (loading) { return <div>Loading...</div>; }
return (
<ul>
<React.Fragment>
{rubrics.map(rubric => {
return (
<li key={rubric.id}>{rubric.title}</li>
);
})}
</React.Fragment>
</ul>
)
};
Run Code Online (Sandbox Code Playgroud)
小智 5
这里的问题是您使用的mapDispatchToProps错误。您不需要显式设置dispatch函数,这就是react redux为您服务的功能。
因此,以下是正确的方法:
// Now you won't be creating a new object every time your component re-renders
const mapDispatchToProps = {
getRubrics: fetchRubrics
}
const Rubrics = (props) => {
const { getRubrics } = props;
// You should always add elements inside your render scope
// to the second array parameter of useEffect to prevent unexpected bugs.
useEffect(() => {
getRubrics();
}, [getRubrics]);
return (
<div>Your component here!</div>
)
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1968 次 |
最近记录: |