删除ReactJS中的项目

时间:2016-03-09 20:29:20

标签: javascript reactjs

我是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 个答案:

答案 0 :(得分:14)

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

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方法并传递新参数。 fiddle

我希望它会对你有所帮助。

由于

答案 1 :(得分:3)

在这里OP。既然四年后我对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的方法,该方法将对象作为参数。然后,它在.filter数组上运行this.state.data,以创建一个包含所有不符合条件的项目的新数组。该条件检查数据数组中每个对象的ID是否与参数的ID相匹配。如果是这样,那么它就是被删除的那个。由.filter创建的新数组被设置为名为newData的变量,然后使用newData数组更新状态。

然后我将此方法传递给名为SearchList的道具中的onDelete组件。

此方法还使用.bind()绑定在构造函数中,因此当方法在组件树中传递时,this将引用正确的this

SearchList.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接受该方法作为道具this.props.onDelete,并将其传递给SearchItem

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

SearchItem.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.handleDelete构造方法中绑定SearchItem

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

答案 2 :(得分:0)

你在寻找这样的东西吗?

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>
    )
}

TodoItem.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/> 
        </>
    )
}

请参阅repository,在这里您可以找到添加、删除和列表项