gpt4 book ai didi

javascript - React-Redux - onClick 在每次状态更改时触发

转载 作者:行者123 更新时间:2023-11-30 20:01:01 26 4
gpt4 key购买 nike

我想通过单击 TodoItem 来删除 TodoItem,但 React 返回“超出最大更新深度。当组件在 componentWillUpdate 或 componentDidUpdate 中重复调用 setState 时可能会发生这种情况。React 限制嵌套更新的数量以防止无限循环。”。它返回是因为我的点击函数在挂载时被调用,在输入时或在单击添加按钮后被调用,我完全不知道为什么它以这种方式工作。

App.js(组件)

class App extends Component {

render() {
return (
<BrowserRouter>
<div className="App">
<Header/>
<div className="container">
<div className="row">
<InputContainer/>
</div>
<TodosList todos={this.props.todos}/> {}
</div>
</div>
</BrowserRouter>
);
}
}

const mapStateToProps = state => {
return {
todos: state.todos
};
};

const mapDispatchToProps = {};

export const AppContainer = connect(mapStateToProps, mapDispatchToProps)(App);

TodosList.js(组件)

import * as React from "react";
import { connect } from "react-redux";
import { TodoItem } from "./TodoItem"
import { handleRemoveTodo } from "./actions"

export class TodosListC extends React.Component{

todoToTodoItem = todo => {
return <TodoItem key={todo.id} todo={todo} onClick={this.removeTodo(todo.id)}/>
};

render(){
return(
<ul className='col-sm-6 col-sm-offset-3'>
{this.props.todos.map(this.todoToTodoItem)}
</ul>
)
}

removeTodo = e => {
this.props.handleRemoveTodo(e);
}

}

const mapStateToProps = state => {
return {
todos: state.todos,
newInput: state.newInput
};
};

const mapDispatchToProps = { handleRemoveTodo };

export const TodosList = connect(mapStateToProps, mapDispatchToProps)(TodosListC);

Todos.js( reducer )

export const todos = (state = initState, action) => {
switch (action.type) {
case 'HANDLE_SAVE_VALUE':
return [
...state,
{
id: action.id,
name: action.text
}
]
case 'HANDLE_REMOVE_TODO':
//firing on input keyup, click submit button and component mount
console.log('HANDLE_REMOVE_TODO',action.id)
var newState = state.filter(function(todo) {
return action.id !== todo.id
});
return[
newState
]
default:
return state
}
}

const initState =
[{id:99998, name: 'Todo99998'},{id:99999, name:'Todo99999'}]

项目 zip 链接 Link

预先感谢您的帮助。

最佳答案

你在这里执行渲染函数

<TodoItem ... onClick={this.removeTodo(todo.id)}/>

onClick需要一个函数,但你在 removeTodo 中调用另一个函数并且什么都不返回,所以要修复你的代码,你可以像这样重写它

<TodoItem ... onClick={() => this.removeTodo(todo.id)} />

关于javascript - React-Redux - onClick 在每次状态更改时触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53383176/

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