我是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 };
});
}
我尝试过以下教程,但我不确定从哪里开始。如何删除搜索项?
答案 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>
({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,在这里您可以找到添加、删除和列表项