简体   繁体   English

ReactJS如何从列表中删除项目

[英]ReactJS how to delete item from list

I have have code that creates <li> elements.我有创建<li>元素的代码。 I need to delete elements one by one by clicking.我需要通过点击一一删除元素。 For each element I have Delete button .对于每个元素,我都有Delete button I understand that I need some function to delete items by id .我知道我需要一些功能来按id删除项目。 How to do this function to delete elements in ReactJS?如何做这个功能来删除 ReactJS 中的元素? My code:我的代码:

class TodoApp extends React.Component {
    constructor(props) {
        super(props);
        this.handleChange = this.handleChange.bind(this);
        this.handleSubmit = this.handleSubmit.bind(this);
        this.state = {items: [], text: ''};
    }

    render() {
        return (
            <div>
                <h3>TODO</h3>
                <TodoList items={this.state.items} />
                <form onSubmit={this.handleSubmit}>
                    <input onChange={this.handleChange} value={this.state.text} />
                    <button>{'Add #' + (this.state.items.length + 1)}</button>
                </form>
            </div>
        );
    }

    handleChange(e) {
        this.setState({text: e.target.value});
    }

    handleSubmit(e) {
        e.preventDefault();
        var newItem = {
            text: this.props.w +''+this.props.t,
            id: Date.now()
        };
        this.setState((prevState) => ({
            items: prevState.items.concat(newItem),
            text: ''
        }));
    }

    delete(id){          // How that function knows id of item that need to delete and how to delete item?
        this.setState(this.item.id)
    }
}

class TodoList extends React.Component {
    render() {
        return (
            <ul>
                {this.props.items.map(item => (
                    <li key={item.id}>{item.text}<button onClick={this.delete.bind(this)}>Delete</button></li>
                ))}
            </ul>
        );
    }
}

You are managing the data in Parent component and rendering the UI in Child component, so to delete item from child component you need to pass a function along with data, call that function from child and pass any unique identifier of list item, inside parent component delete the item using that unique identifier.您正在管理父组件中的数据并在子组件中呈现 UI,因此要从子组件中删除项目,您需要传递一个函数和数据,从子组件调用该函数并在父组件内部传递列表项的任何唯一标识符使用该唯一标识符删除项目。

Step1: Pass a function from parent component along with data, like this: Step1:从父组件传递一个函数和数据,像这样:

<TodoList items={this.state.items} _handleDelete={this.delete.bind(this)}/>

Step2: Define delete function in parent component like this: Step2:在父组件中定义delete函数,如下所示:

delete(id){
    this.setState(prevState => ({
        data: prevState.data.filter(el => el != id )
    }));
}

Step3: Call that function from child component using this.props._handleDelete() :步骤 3:使用this.props._handleDelete()从子组件调用该函数:

class TodoList extends React.Component {

    _handleDelete(id){
        this.props._handleDelete(id);
    }

    render() {
        return (
            <ul>
                {this.props.items.map(item => (
                    <li key={item.id}>{item.text}<button onClick={this._handleDelete.bind(this, item.id)}>Delete</button></li>
                ))}
            </ul>
        );
    }
}

Check this working example:检查这个工作示例:

 class App extends React.Component{ constructor(){ super(); this.state = { data: [1,2,3,4,5] } this.delete = this.delete.bind(this); } delete(id){ this.setState(prevState => ({ data: prevState.data.filter(el => el != id ) })); } render(){ return( <Child delete={this.delete} data={this.state.data}/> ); } } class Child extends React.Component{ delete(id){ this.props.delete(id); } render(){ return( <div> { this.props.data.map(el=> <p onClick={this.delete.bind(this, el)}>{el}</p> ) } </div> ) } } ReactDOM.render(<App/>, document.getElementById('app'))
 <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> <div id='app'/>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM