使用React怎么实现点击删除列表中的对应项-创新互联
本篇文章给大家分享的是有关使用React怎么实现点击删除列表中的对应项,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
创新互联建站长期为1000+客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为周村企业提供专业的网站建设、成都网站建设,周村网站改版等技术服务。拥有十载丰富建站经验和众多成功案例,为您定制开发。逻辑:整个待展示列表(由子组件组成的数组)是个state,添加按钮会增加一个元素到这个state里面,添加的方法如下:
add(){ var lists=this.state.lists; lists.push(); this.setState({lists:lists}) }
注意一点,这个index属性是固定的,子组建生成后就固定了,这就为你未来挖了一个坑。
删除按钮当然就是从这个state列表里删除对应元素了,问题一来了,我怎么知道是第几个元素?一拍脑袋这还不简单,event.target 获取点击的标签,在标签上写个index属性告诉delete方法是第几个元素不就得了?试了发现不行,看看文档,event.target确实获取dom元素没毛病,但是index这个属性原生dom根本不承认啊,怎么办?data-index就行了,前面加 data- 就是dom承认的自定义属性了。
写完了又想起了两个方法,一个是在删除按钮绑定删除事件的时候,.bind(this,index),index是你准备删掉的是第几个或者表示出来你要删哪个就行。另一个是搞个闭包,就能把index参数传进去了(事件绑定一个立即执行的方程传入参数,该方程返回目标方程)。
第一个问题解决,删除的方法如下:
delete(e){ var index=e.target.getAttribute("data-index"); var lists=this.state.lists; lists.splice(index,1); this.setState({lists:lists}) }
data-index告诉你要删除第几个元素,然后把它从state里踢出去就行了。这回掉进了一个真正意义上的坑:有时候删的不是对应的元素!乱套了!
好吧,我沉思了5分钟,想到了为什么:生成列表的时候index已经固定,但删除列表的时候我们只告诉他删除的是第index项!问题严重了,举个例子,有两项,index 0和1 你点0,好吧第0项删掉了,你再点1,疑?没反应了,因为你打算删除第1项,而列表中目前只有第0项(就是原来的第一项,原来的第0项删除后他就成了第0项)!这会导致各种乱套,考虑到生成列表的index是列表长度表示的就更乱了。
解决方式:delete方法里修改一行:
lists.splice(index,1,"");
好了,删除的元素我用空字符串代替,这样顺序和删除的项,还有以后添加的项的index都不会乱了,给自己点赞。到这里第一种方法实现了目标。
Code pen 地址:http://codepen.io/huanqingli/pen/dNyQez
完整代码:
class List extends React.Component { render() { return (X) } } class Lists extends React.Component { constructor(props) { super(props); this.add=this.add.bind(this); this.delete=this.delete.bind(this); this.state={ lists:[] } } add(){ var lists=this.state.lists; lists.push(); this.setState({lists:lists}) } delete(e){ var index=e.target.getAttribute("data-index"); var lists=this.state.lists; console.log(index) lists.splice(index,1); this.setState({lists:lists}) } render() { return (
添加 {this.state.lists}) } } ReactDOM.render(, document.getElementById('lists') );
这种方法有利有弊,所以我找到了第二种方法,具体情况择优使用。
第二种方法。总体来讲推荐这种方法。
在state里保存要展示的数据,在render里动态生成子组件组,然后添加删除都是操作保存数据的state,render里的子组件会自动刷新。这种方式应该是更贴近React思路的,用数据展现界面。如果你要展现一组数据,这种方法很自然,但如果展现的是一个动态的表单,稍微麻烦一点,但也可以做,而且我依然推荐用这种方式。
这种方法做个todolist就很简单,这里依然做上文的例子,稍微麻烦一点,也会理解的更深入一点。
整体结构和第一种方法一样,只不过这次state里面不是子组件,先用空字符串组成的数组代替,仅仅是为了render的时候知道有几个子组件而已。添加的时候也要push空字符串,等输入框输入数据后,更新state中的内容,做到数据和界面同步。
render子组件的部分:
{this.state.lists.map(function (item,index) { return}.bind(this))}
添加的方法变成:
add(){ var lists=this.state.lists; lists.push(""); this.setState({lists:lists}) }
这就能跑了,这有个小坑,稍有不慎你发现你怎么删都是删列表的最后一项,其实数据操作没问题,关键是这个存在感比较低的key,必须特定项有给定的key你用动态的index他就懵了,不知道删哪个了,他就吧最后一个删了。废话不多说(该程序因为key键取值的问题有一个小问题):
Code pen 地址:http://codepen.io/huanqingli/pen/xgxNYN
整体代码:
class List extends React.Component { constructor(props){ super(props); this.upData=this.upData.bind(this); } upData(e){ this.props.upData(this.props.index,e.target.value) } render() { return (X) } } class Lists extends React.Component { constructor(props) { super(props); this.add=this.add.bind(this); this.delete=this.delete.bind(this); this.upData=this.upData.bind(this); this.state={ lists:[] } } add(){ var lists=this.state.lists; lists.push(""); this.setState({lists:lists}) } delete(e){ var index=e.target.getAttribute("data-index"); var lists=this.state.lists; lists.splice(index,1); this.setState({lists:lists}) } upData(i,x){ var lists=this.state.lists; lists[i]=x; console.log(lists); this.setState({lists:lists}); } render() { return (添加 {this.state.lists.map(function (item,index) { return) } } ReactDOM.render(}.bind(this))}
, document.getElementById('lists') )
以上就是使用React怎么实现点击删除列表中的对应项,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联网站建设公司行业资讯频道。
另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
当前文章:使用React怎么实现点击删除列表中的对应项-创新互联
文章路径:http://ybzwz.com/article/cedpis.html