reactjs - 调度和设置状态后是否调用或更新渲染
问题描述
我制作会员组件。通话componentDidMount()
功能getMemberList()
class Members extends Component{
constructor(props) {
super(props);
this.state = {
members: []
}
}
componentDidMount() {
getMemberList(this.props);
}
render() {
return (
<div>
<div>Members</div>
{this.state.members.map((member) => (
<li key={member.id}>
{member.name}
</li>
))}
</div>
);
}
}
export default connect((state) => state)(Members);
当函数getMemberList()
被调用时,它连接服务器并放置成员数据并进行操作和调度。
export function getMemberList(props){
axios.get('/api/members')
.then(function (response) {
// handle success
let data = response.data;
let members = data.data;
let action = {
type: 'GET_MEMBERS',
members: members,
};
props.dispatch(action);
})
.catch(function (error) {
// handle error
console.log(error);
return {
type: 'GET_MEMBERS_ERROR',
authenticated: false
};
})
.finally(function () {
// always executed
});
}
然后调用 reducer 并将成员设置为状态。它似乎运作良好。
const initData = {
members: []
}
export function memberReducer(state = initData, action){
switch (action.type) {
case 'GET_MEMBERS':
return {
members: action.members
};
case 'GET_MEMBERS_ERROR':
return state;
default:
return state;
}
}
但是我的理解是 render 应该在调度后调用。JSX 中的成员列表未更新。
是不是对我有误解?
请帮助并给我一个建议。
解决方案
您的组件应如下所示:
class Members extends Component {
componentDidMount() {
getMemberList(this.props);
}
render() {
return (
<div>
<div>Members</div>
{this.props.members.map(member => (
<li key={member.id}>{member.name}</li>
))}
</div>
);
}
}
// this function takes your redux state and returns an object with a key of members to your component. You will be able to access the members value in your component by this.props.members - again, it's mapped your redux STATE to your react PROPS
const mapStateToProps = state => {
return {
members: state.members
};
};
export default connect(mapStateToProps)(Members);
该members
数组应该来自您的 redux 存储。在您的组件中,您正在查看处于members
反应状态的数组。那里什么都没有,也没有更新。
您需要将您的 redux 状态映射到您的组件。在上面的代码片段中,这就是mapStateToProps
/connect
正在做的事情。您正在获取 redux 状态并通过connect
组件将值传递给您的反应道具。
我不确定你的传球是getMemberList
什么this.props
。
推荐阅读
- php - Symfony 4 - 设置 Braintree Payments 集成
- go - 为什么在 OpenWRT 上运行 Golang 的 time.Now() 总是得到 UTC 时间?
- django - 为什么我遇到此错误“[remote denied] master -> master (pre-receive hook denied)”?
- r - 如何使用调查数据分布图
- dialogflow-es - 使用 streaming_detect_intent 流式传输音频时获得中间结果
- legend - qwt:如何在图例中添加额外的文本
- r - 在 R-markdown 中折叠/隐藏多个图像
- arrays - 将double for循环转换为递归函数
- javascript - 将 MP4 url 与 wavesurfer.js 一起使用
- botframework - 使用邮递员在本地测试 MS bot