gpt4 book ai didi

javascript - 无法根据 props 或状态更改更新组件

转载 作者:行者123 更新时间:2023-12-03 00:18:13 26 4
gpt4 key购买 nike

如果 showEdit 为 true,我希望浏览器显示 EditMessage 组件(在 Dashboard.js 中)(请参阅 initState > 在 MessageReducer.js 中)和 CreateMessage 组件,如果 showEdit 为 false 但我的代码不起作用。我的应用程序没有注意到 Dashboard.js 中的状态或属性更改。

我尝试在 Dashboard.js 中包含 this.setState 方法,但收到错误:“超出最大更新深度。当组件重复调用 setState 时,可能会发生这种情况在 componentWillUpdate 或 componentDidUpdate 内”。我还尝试将 showTypeForm 的值直接分配给 props 并将其输出(请参阅 Dashboard.js 中的注释),但这种方法也不起作用。我不确定使用什么生命周期方法。

我的代码如下所示。MessageSummary.js:

 import React, { Component } from 'react';
import { connect } from 'react-redux';
class MessageSummary extends Component {
editClick = (e) => {
e.preventDefault();
this.props.editMessage('123', 'I love web development'); //test values
}
render() {
return (
<button className="edit-message" onClick={this.editClick}>Edit
Message</button> // this button changes showEdit in MessageReducer.js
)
}
}
const mapDispatchToProps = (dispatch) => {
return {
editMessage: (id, newMessage) => dispatch(editMessage(id, newMessage))
}
}
export default connect(null, mapDispatchToProps)(MessageSummary);

MessageActions.js:

export const editMessage = (id, newMessage) => {
return (dispatch, getState, { getFirebase, getFirestore }) => {
dispatch({
type: "EDIT_MESSAGE"
});
}
}

RootReducer.js:

// importing everything
const rootReducer = combineReducers({
message: messageReducer
});
export default rootReducer;

MessageReducer.js:

const initState = {
showEdit: false
};
const messageReducer = (state = initState, action) => {
switch (action.type) {
case 'EDIT_MESSAGE':
initState.showEdit = !initState.showEdit; // toggling showEdit
return state;
default:
return state;
}
}
export default messageReducer;

仪表板.js:

// importing everything
class Dashboard extends Component {
state = {
showEdit: this.props.message.showEdit
}

render() {
const { message } = this.props; // destructuring

// this.setState({
// showEdit: message.showEdit
// })

// const showTypeForm = message.showEdit ? <EditMessage /> : <CreateMessage />;

return (
<div className="message-form">
{this.state.showEdit ? <EditMessage /> : <CreateMessage />}
// {showTypeForm }
</div>
)
}
const mapStateToProps = (state) => {
return {
message: state.message
}
}
}
export default connect(mapStateToProps)(Dashboard);

最佳答案

您的 reducer “MessageReducer.js”有问题。在这里,您直接改变了“initState”值,这违反了 reducer 函数规范。它应该是一个纯函数,不应该改变状态,每次它都应该返回一个新的状态对象。
请尝试在 MessageReducer.js 中使用以下更新的代码

const initState = {
showEdit: false
};
const messageReducer = (state = initState, action) => {
switch (action.type) {
case 'EDIT_MESSAGE':
let updatedState = Object.assign({},state,{showEdit:!state.showEdit}) ;
return updatedState;
default:
return state;`enter code here`
}
}
export default messageReducer;

关于javascript - 无法根据 props 或状态更改更新组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54438940/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com