首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >反应做清单,我如何使这个删除按钮工作?

反应做清单,我如何使这个删除按钮工作?
EN

Stack Overflow用户
提问于 2017-11-21 13:19:14
回答 2查看 696关注 0票数 1

我有一个简单的做应用程序,是很好的工作,除了删除的能力,从列表中的项目。我已经将按钮添加到每个列表项中。我知道我希望使用.filter()方法来传递状态--一个没有删除待办事项的新数组,但我不知道如何执行这样的操作。

以下是应用程序的主要组件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class App extends Component {
  constructor(props){
    super(props);
    this.state = {
      todos: [
        { description: 'Walk the cat', isCompleted: true },
        { description: 'Throw the dishes away', isCompleted: false },
        { description: 'Buy new dishes', isCompleted: false }
      ],
      newTodoDescription: ''
    };
  }

  deleteTodo(e) {
    this.setState({ })
  }

  handleChange(e) {
    this.setState({ newTodoDescription: e.target.value })
  }

  handleSubmit(e) {
    e.preventDefault();
    if (!this.state.newTodoDescription) { return }
    const newTodo = { description: this.state.newTodoDescription, 
    isCompleted: false };
    this.setState({ todos: [...this.state.todos, newTodo], 
    newTodoDescription: '' });
  }

  toggleComplete(index) {
    const todos = this.state.todos.slice();
    const todo = todos[index];
    todo.isCompleted = todo.isCompleted ? false : true;
    this.setState({ todos: todos });
  }

  render() {
    return (
      <div className="App">
        <ul>
          { this.state.todos.map( (todo, index) =>
            <ToDo key={ index } description={ todo.description } 
              isCompleted={ todo.isCompleted } toggleComplete={ () => 
              this.toggleComplete(index) } />
          )}
        </ul>
        <form onSubmit={ (e) => this.handleSubmit(e) }>
          <input type="text" value={ this.state.newTodoDescription } 
            onChange={ (e) => this.handleChange(e) } />
          <input type="submit" />
        </form>

      </div>
    );
  }
}

下面是待办事项的组成部分:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ToDo extends Component {
  render() {
    return (
      <li>
        <input type="checkbox" checked={ this.props.isCompleted } 
          onChange={ this.props.toggleComplete } />
        <button>Destroy!</button>
        <span>{ this.props.description }</span>
      </li>
    );
  }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-21 13:34:18

事件处理程序到救援:

您可以将onDelete道具发送到每个ToDo

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const Todo = ({ description, id, isCompleted, toggleComplete, onDelete }) => 
  <li>
    <input
      type="checkbox"
      checked={isCompleted} 
      onChange={toggleComplete}
    />
    <button onClick={() => onDelete(id)}>Destroy!</button>
    <span>{description}</span>
  </li>

来自App

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<ToDo 
  // other props here
  onDelete={this.deleteTodo}
/>

正如@Dakota所指出的,在通过列表进行映射时使用索引作为键并不是一种好的模式。

也许只需更改您的initialState并为其中每一个设置一个id

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
this.state = {
  todos: [
    { id: 1, description: 'Walk the cat', isCompleted: true },
    { id: 2, description: 'Throw the dishes away', isCompleted: false },
    { id: 3, description: 'Buy new dishes', isCompleted: false }
  ],
  newTodoDescription: '',
}

这也使从数组中删除项更容易:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
deleteTodo(id) {
  this.setState((prevState) => ({
    items: prevState.items.filter(item => item.id !== id),
  }))
}
票数 2
EN

Stack Overflow用户

发布于 2017-11-21 13:33:23

在更进一步之前,您不应该使用列表索引作为您的React元素的键。给您的ToDo一个id并使用它作为密钥。有时候,你可以逃脱这个问题,但是当你删除一些东西时,它几乎总是会引起问题。

https://medium.com/@robinpokorny/index-as-a-key-is-an-anti-pattern-e0349aece318

如果你不想读这篇文章,只要知道这一点

让我解释一下,键是唯一用于识别DOM元素的React。如果您将项目推入列表或删除中间的某个内容,会发生什么情况?如果键与前面相同,React假设DOM元素表示与前面相同的组件。但这已不再是事实。

在另一个注意事项上,添加一个onClick到您的按钮,并传递函数,您希望它运行作为一个道具从应用程序。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<button onClick={() => this.props.handleClick(this.props.id)} />

和App.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...

constructor(props) {
  ...
  this.handleClick = this.handleClick.bind(this);
}

handleClick(id) {
  // Do stuff
}

<ToDo
  ...
  handleClick={this.handleClick}
/>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47422915

复制
相关文章
在这个大环境下我是如何找工作的
蛮久没更新了,本次我想聊聊找工作的事情,相信大家都能感受到从去年开始到现在市场是一天比一天差,特别是在我们互联网 IT 行业。已经过了 18 年之前的高速发展的红利期,能做的互联网应用几乎已经被各大公司做了个遍,现在已经进入稳定的存量市场,所以在这样的大背景下再加上全世界范围内的经济不景气我想每个人都能感受到寒意。
crossoverJie
2023/08/18
2130
在这个大环境下我是如何找工作的
「我」做算法工作的小反思!
本文是作者在算法岗位上的工作反思,含算法篇和成长篇两部分,希望为在学习或在工作的大家提供一个经验参考。
guichen1013
2022/09/22
2960
Js如何防止页面后退(使浏览器后退按钮失效)[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/164194.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/16
4.4K0
Js如何防止页面后退(使浏览器后退按钮失效)[通俗易懂]
我是如何看这个世界
首先这里要感谢大家支持。公众号第一篇文章发出后不到一星期就有500人关注,另外文章还被阿里天池的官方公众号转载,非常高兴能得到大家的认可。这段时间有很多朋友提供了宝贵的帮助和建议,包括一些大V主动转载并推荐我的公众号,小伟不胜感激。我这个人有一说一,别人对我的好我都会一直记着,你帮了我,日后若有需要尽管开口,我一定加倍帮你。
用户9656380
2022/04/14
5900
我是如何看这个世界
jquery点击删除按钮,删除当前的div
现在有多行div,共用一个删除事件,点击删除的时候,会把页面所有的div全都删掉了,但是我只需要点击哪一行div里面的删除按钮,就删除哪一行,其实很简单,只需要写一个this事件即可。
王小婷
2019/07/08
5.2K0
我的Mac应用清单
相信大家或多或少都会碰到这种问题:Mac到底有什么好的,同样或者更低的价钱,我可以买一个配置更好的Windows电脑了。首先,Mac系统是基于Unix系统的,因此它更加稳定、流畅,而且Mac显示器非常清晰,人眼看起来非常舒适,特别是MacBook Pro,其次,Mac续航能力非常强,基本上可以维持在8个小时左右。如果你不怎么玩游戏,那么选择Mac是正确的选择,而且如果你经常开会,则可以选择air或者macbook,如果你经常开发,则选择Macbook Pro 13中配,或者你不差钱,那么直接选择Macbook Pro 15顶配。
木可大大
2018/05/28
1.3K2
我的Mac应用清单
相信大家或多或少都会碰到这种问题:Mac到底有什么好的,同样或者更低的价钱,我可以买一个配置更好的Windows电脑了。首先,Mac系统是基于Unix系统的,因此它更加稳定、流畅,而且Mac显示器非常清晰,人眼看起来非常舒适,特别是MacBook Pro,其次,Mac续航能力非常强,基本上可以维持在8个小时左右。如果你不怎么玩游戏,那么选择Mac是正确的选择,而且如果你经常开会,则可以选择air或者macbook,如果你经常开发,则选择Macbook Pro 13中配,或者你不差钱,那么直接选择Macbook Pro 15顶配。
木可大大
2018/07/25
8270
我的Mac应用清单
Postman 如何删除一个工作空间
Postman 删除工作空间的地方比较隐蔽。 在你打开工作空间后,选择工作空间的设置。 在后续的页面中,将会提示你是否选择删除这个工作空间。 在随后的页面中,提示你输入工作空间的名字,然后单击确定删除即可。 https://www.ossez.com/t/postman/13936
HoneyMoose
2022/05/07
8970
Postman 如何删除一个工作空间
Postman 如何删除一个工作空间
Postman 删除工作空间的地方比较隐蔽。 在你打开工作空间后,选择工作空间的设置。 在后续的页面中,将会提示你是否选择删除这个工作空间。 在随后的页面中,提示你输入工作空间的名字,然后单击确定删除即可。 https://www.ossez.com/t/postman/13936
HoneyMoose
2022/04/30
8690
Postman 如何删除一个工作空间
我是如何做 PPT 的
大家周末愉快。周末就分享一点轻松的东西,不和大家一起做题啦。依然是不写长篇大论,就说我认为最重要的。
用户9848496
2022/09/26
6350
自己做悬浮拖拽按钮依赖
PS:悬浮拖拽按钮的使用也是非常广的,就比如说上一个网站的时候就会弹出一个对话框,对话框可以随意拖动,那么安卓手机上可以实现吗,答案是可以的,这就用到了自定义view的按压点击等事件,本文的例子比较简单是继承FloatingActionButton,这个控件本身就做的很好了,点击效果,按压出的投影等都是可以调节的,所以继承他就可以省去写很多细节代码。网上也是有很多博友写了有关的文章,讲了原理也是很清楚的,写的都很好,也有很多写的代码基本上差不多,再怎么变MotionEvent方法的DOWN、MOVE、UP等
cMusketeer
2018/07/04
1.6K0
我没啥特长,如何找好工作
很多同学感慨:感觉自己工作了一段时间,没啥特别牛逼的能力,做的事情都很普通。这样怎么找个好工作呢?今天系统解答一下。
接地气的陈老师
2019/12/09
4500
前端离职工作项目交接清单
仰天大笑出门去,我辈岂是蓬蒿人?金三银四就要到了,大家一定跃跃欲试,甚至已经收获了很多offer。
Tz一号
2022/05/11
2.3K0
前端离职工作项目交接清单
django admin 列表禁用删除操作,编辑页面禁用删除按钮
class AnchorBindAgentAdmin(admin.ModelAdmin): def get_actions(self, request): # 列表禁用删除操作 if 'delete_selected' in actions: del actions['delete_selected'] return actions def has_delete_permission(self, request, o
卓越笔记
2023/02/18
2.1K0
SPA PP COGI中禁用删除按钮?
本文章仅用于SAP软件的应用、学习沟通,文中所示的截图来源于SAP软件,相应著作权归SAP公司所有。
SPA_小阿龙
2021/02/24
1.7K0
我是如何做测试组长的
我们性能测试组算我总共5个人,人员少,任务重。将测试人员分为2组,每组一名小组长,一个人兼顾几个职能(脚本开发,监控,数据准备,分析),即要完成任务,又要保证质量。测试计划,测试方案由小组长制定,测试组长参与评审,测试过程采用日报形式实时报告,有问题当面沟通。测试报告由小组长提交,在提交客户评审前进行内部评审。测试完成之后必须进行测试总结,将一些重点难点进行分享,加入到知识库中。
软件测试君
2019/06/03
1.5K0
做技术,如何使自己在重复性业务中持续提升?
每个工作两年以上的技术人都应该想过,自己每天这样的这些业务代码,并没有什么技术含量,也没有什么拿得出手的项目,在公司的始终处于螺丝钉的地位,觉得自己目前做的一切虽然对公司有价值,但是似乎对自己并没有什么价值,难道一成不变的工作内容对我们真的没有任何价值么?
代码宇宙
2023/02/23
6900
我是如何破解亚马逊一键购物按钮的?
怎么和婴儿沟通呢?他/她什么时候睡觉?什么时候起来? 这看起来是个简单的问题,但并不好解决,于是我开始选择一些婴儿跟踪应用程序,但是功能貌似太单一,不理想。随着孩子的成长,功能需要不断加强。作者想要一
FB客服
2018/02/07
1.3K0
我是如何破解亚马逊一键购物按钮的?
我是如何快速积累工作经验
前端的程序员,请戳进来。 以下都是一些日常工作中的小技巧,提高工作效率节省时间为公司做贡献,但无论如何,于个人而言,都要在培养自己在日敲代码三千行的道路上努力前进。 01:学习列表 个人习惯,在开发过程中,总会遇到一些生疏的名词和知识点,那就去百度,百度之后再加上延伸的知识点一起,把链接记录在学习列表里,周一到周五晚上都是最佳的学习时间,拿着白天遇到的问题,再重温一遍,下次遇到,也就熟悉了。 02:印象笔记 好记性不如烂笔头,程序员必备神器,印象笔记。此处打个广告,在你的手机和电脑上,使用印象笔记来捕捉、培
王小婷
2018/06/05
5400
点击加载更多

相似问题

我如何使这个反应正常?

22

如何使提交按钮工作/反应?

217

流星-我如何使这个“反应”使用Dep?

21

我如何使这个JButton工作

11

我如何使这个CommandParameter工作?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文