在 ReactJS 中删除项目

IT技术 javascript reactjs
2021-05-19 05:09:01

我是 React 的新手,并制作了一个允许保存搜索的应用程序。这将拉取 JSON,但目前正在从静态数组中拉取data我无法从搜索列表中删除搜索。

这是jsbin:http ://jsbin.com/nobiqi/edit?js,output

这是我的删除按钮元素:

var DeleteSearch = React.createClass({
  render: function() {
    return (
      <button onClick="this.props.deleteSearchItem" value={index}><i className="fa fa-times"></i>
        </button>
    );
  }
});

和我的功能

  deleteSearchItem: function(e) {
    var searchItemIndex = parseInt(e.target.value, 10);
    console.log('remove task: %d', searchItemIndex);
    this.setState(state => {
        state.data.splice(searchItemIndex, 1);
        return { data: state.data };
    });
  }

我试过遵循教程,但我不知道从哪里开始。如何删除搜索项?

3个回答

让我猜猜,你在寻找这样的东西吗?

class Example extends React.Component {
    constructor(){
    this.state = {
      data: [
        {id:1, name: 'Hello'},
        {id:2, name: 'World'},
        {id:3, name: 'How'},
        {id:4, name: 'Are'},
        {id:5, name: 'You'},
        {id:6, name: '?'}
      ]
    }
  }

  // shorter & readable 
  delete(item){
    const data = this.state.data.filter(i => i.id !== item.id)
    this.setState({data})
  }

  // or this way, it works as well
  //delete(item){
  //  const newState = this.state.data.slice();
  //    if (newState.indexOf(item) > -1) {
  //    newState.splice(newState.indexOf(item), 1);
  //    this.setState({data: newState})
  //  }
  //}

  render(){
    const listItem = this.state.data.map((item)=>{
        return <div key={item.id}>
        <span>{item.name}</span> <button onClick={this.delete.bind(this, item)}>Delete</button>
      </div>
    })
    return <div>
        {listItem}
    </div>
  }
}

React.render(<Example />, document.getElementById('container'));

在此示例中,请注意我如何绑定delete方法并传递新参数。小提琴

我希望它会帮助你。

谢谢

在这里。因为四年后我对 React 有了更多的了解,而且这仍然引起人们的关注,所以我想我会用我现在的做法来更新它。

SavedSearches.js

import React from 'react'
import { SearchList } from './SearchList'

let data = [
    {index: 0, name: "a string", url: 'test.com/?search=string'},
    {index: 1, name: "a name", url: 'test.com/?search=name'},
    {index: 2, name: "return all", url: 'test.com/?search=all'}
  ];

let startingIndex = data.length;

export class SavedSearches extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            name: '',
            url: '',
            index: startingIndex,
            data: data
        }
        this.deleteSearch=this.deleteSearch.bind(this)
    }
    deleteSearch(deleteThis) {
        console.log(deleteThis);
        let newData = this.state.data.filter( searchItem => searchItem.index !== deleteThis.index )
        this.setState({
            data: newData
        })
    }

    render() {
        return (
            <div className="search-container">
                <SearchList data={this.state.data} onDelete={this.deleteSearch}/>
            </div>
        )
    }
}

在这里,我创建了一个名为的方法deleteSearch该方法将对象作为参数。然后它.filterthis.state.data数组上运行以创建一个包含所有不满足条件的项目的新数组。条件检查数据数组中每个对象的 id 是否与参数的 id 匹配。如果是这样,那么它就是被删除的那个。创建的新数组.filter被设置为一个名为 的变量newData,然后我用该newData数组更新状态

然后我将此方法传递给SearchList名为 .prop组件中组件onDelete

此方法也绑定在构造函数 using 中,.bind()以便在该方法沿组件树向下传递时this将引用正确this的方法。

搜索列表.js

import React from 'react'
import { SearchItem } from './SearchItem'
export class SearchList extends React.Component {
    render() {
      let searchItems = this.props.data.map((item, i) => {
        return (
          <SearchItem index={i} searchItem={item} url={item.url} onDelete={this.props.onDelete}>
            {item.name}
          </SearchItem>
        );
      });
      return (
        <ul>
          {searchItems}
        </ul>
      );
    }
}

我的deleteSearch方法只是通过这里的组件树。SearchList接收方法作为propsthis.props.onDelete并将其传递给SearchItem.

这里的另一个主要关键是 map 函数中的参数作为 props: 传递searchItem={item}这将允许通过 props 访问整个当前对象;如果你还记得的话,我的deleteSearch函数接受一个对象作为参数。

搜索项.js

import React from 'react'

export class SearchItem extends React.Component {
    constructor(props) {
        super(props);
        this.handleDelete=this.handleDelete.bind(this)
    }
    handleDelete() {
        this.props.onDelete(this.props.searchItem)
    }
    render() {
      return (
        <li key={this.props.index}> {/* Still getting a console error over this key */}
          <a href={this.props.url} title={this.props.name}>
            {this.props.children}
          </a>
          &nbsp;({this.props.url})
          <button onClick={this.handleDelete} value={this.props.index}><i className="fa fa-times"></i>
          </button>
        </li>
      );
    }
  };

现在我的方法到达了它将被使用的地方。我创建了一个处理程序方法,handleDelete并在内部deleteSearch使用this.props.onDelete. 然后我将正在单击的列表项的对象传递给它this.props.searchItem

为了这个工作,当用户点击,我不得不添加一个onClick事件侦听器调用我的处理方法,就像这样:onClick={this.handleDelete}最后一步是this.handleDeleteSearchItem构造函数方法中绑定

现在,单击按钮将从this.state.data数组中删除该项目有关如何向数组添加项目的示例,请参阅我的存储库

你在找这样的东西吗?

Todos.js

import React from 'react'
import {TodoItem} from "./TodoItem";

export const Todos = (props) => {

    let myStyle = {
        minHeight: "70vh",
        margin: "40px auto"
    }
    return (
        <div className="container" style={myStyle}>
            <h3 className="my-3">List</h3>
            {props.todos.length===0? "No records to display":  
            props.todos.map((todo)=>{
                console.log(todo.sno);
                return (<TodoItem todo={todo} key={todo.sno} onDelete={props.onDelete}/>   
                )
            })
              } 
        </div>
    )
}

待办事项.js

import React from 'react'

export const TodoItem = ({todo, onDelete}) => {

    return (
        <>
        <div>
           <h4>{todo.title}</h4>
           <p>{todo.desc}</p>
           <button className="btn btn-sm btn-danger" onClick={()=>{onDelete(todo)}}>Delete</button> 
        </div>
        <hr/> 
        </>
    )
}

请查看存储库,在这里您可以找到添加、删除和列表项