如何在 ReactJS 中使用单击事件从列表中删除项目
how to remove an item from a list with a click event in ReactJS?
var FilterList = React.createClass({
remove: function(item){
this.props.items = this.props.items.filter(function(itm){
return item.id !== itm.id;
});
return false;
},
render: function() {
var createItem = function(item) {
return (
<li>
<span>{item}</span>
<a href data-id="{item.id}" class="remove-filter" onClick={this.remove.bind(item)}>remove</a>
</li>
);
};
return <ul>{this.props.items.map(createItem.bind(this))}</ul>;
}
});
var FilterApp = React.createClass({
getInitialState: function() {
return {items: [], item: {
id: 0,
type: null
}};
},
onChangeType: function(e){
this.setState({
item: {
id: this.state.items[this.state.items.length],
type: e.target.value
}
});
},
handleSubmit: function(e) {
e.preventDefault();
var nextItems = this.state.items.concat([this.state.item]);
var item = {};
this.setState({items: nextItems, item: {}});
},
render: function() {
return (
<div>
<h3>Filters</h3>
<FilterList items={this.state.items} />
<form className="filter" onSubmit={this.handleSubmit}>
<fieldset>
<legend>Filter</legend>
<div className="form-grp">
<select name="type" onChange={this.onChangeType}>
<option>foo</option>
<option>bar</option>
<option>baz</option>
</select>
</div>
</fieldset>
<div className="actions">
<button>{'Add #' + (this.state.items.length + 1)}</button>
</div>
</form>
</div>
);
}
});
React.render(<FilterApp />, document.body);
我似乎无法弄清楚如何从列表中删除项目。新手们,可能也会在这里做出大量其他糟糕的设计决策。
组件
上的 props 是不可变的,这意味着您不能直接修改它们。在上面的示例中,如果FilterList
组件想要删除项目,则需要从父组件调用回调。
一个简化的例子。
FilterApp
将删除函数传递给FilterList
,该函数在 onClick
事件上调用。这将从父项中删除项,更新状态,然后使FilterList
使用新内容重新呈现。
希望这有帮助。
像下面这样的东西应该可以工作。让您的根组件管理状态。
var FilterList = React.createClass({
render: function() {
var createItem = function(item) {
return (
<li>
<span>{item}</span>
<a href data-id="{item.id}" class="remove-filter" onClick={this.props.remove.bind(item)}>remove</a>
</li>
);
};
return <ul>{this.props.items.map(createItem.bind(this))}</ul>;
}
});
var FilterApp = React.createClass({
getInitialState: function() {
return {items: [], item: {
id: 0,
type: null
}};
},
onChangeType: function(e){
this.setState({
item: {
id: this.state.items[this.state.items.length],
type: e.target.value
}
});
},
remove: function(item, ev){
ev.preventDefault();
var items = this.state.items.filter(function(itm){
return item.id !== itm.id;
});
this.setState({ items: items });
},
handleSubmit: function(e) {
e.preventDefault();
var nextItems = this.state.items.concat([this.state.item]);
var item = {};
this.setState({items: nextItems, item: {}});
},
render: function() {
return (
<div>
<h3>Filters</h3>
<FilterList remove={this.remove} items={this.state.items} />
<form className="filter" onSubmit={this.handleSubmit}>
<fieldset>
<legend>Filter</legend>
<div className="form-grp">
<select name="type" onChange={this.onChangeType}>
<option>foo</option>
<option>bar</option>
<option>baz</option>
</select>
</div>
</fieldset>
<div className="actions">
<button>{'Add #' + (this.state.items.length + 1)}</button>
</div>
</form>
</div>
);
}
});
React.render(<FilterApp />, document.body);
相关文章:
- 鼠标悬停事件影响列表中所有行中的按钮,而不仅仅是特定按钮
- 如何刷新列表框内容onclick或blur事件
- 如何在HTML列表中添加事件's子弹
- 当触发下拉列表的onchange事件时,使用JavaScript提交表单
- 将事件列表滚动到给定月份的第一个事件
- 对象 Javascript 中的标签无效 - 想要添加事件列表器
- SVG-全局属性和事件的列表
- 如何从加载的JSON文件构建外部事件列表
- 有没有一种方法可以在没有jQuery的情况下获得JavaScript中当前添加到后台的事件列表
- 通过更改HTML元素上的动态类名来处理事件列表器
- 事件列表器不适用于追加的项目
- 使用 JQuery 将事件列表器添加到动态添加的元素
- 谷歌日历事件列表jQuery格式
- 将事件列表器添加到多个图像
- 动态加载图像并附加加载事件列表器
- 从谷歌日历 API 中的事件列表中检索实例
- 如何在类上设置实时事件列表器,以自动调整其高度并调整其内容的大小
- 在DOM中触发的事件列表
- Jquery点击事件列表上的锚
- Javascript移动事件列表