首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >ReactJS嵌套的组件属性为空

ReactJS嵌套的组件属性为空
EN

Stack Overflow用户
提问于 2020-04-21 19:10:08
回答 3查看 192关注 0票数 1

我正在尝试在ReactJS中嵌套一些组件,以便构建一个待办事项应用程序,但是当元素传递到映射函数中时,它是未定义的。

嵌套组件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var El2= class App extends React.Component{
    constructor(props) { //constructor
        super(props);
        this.state = {
          todos: ['work out', 'eat breakfast', 'take a shower']/*,
        }
      }

    /**********methods**********/

    onDelete(item){
      let updatedTodos = this.state.todos.filter(function(val,index){
        return item!==val;
      });
      this.setState({todos:updatedTodos});
    }

    /********rendering method*******/

    render(){
      let todos = this.state.todos;
      todos=todos.map((item,index)=>{
        return(
          <TodoItem item={item} key={index} onDelete={this.onDelete}/>
        )
      })


        return(//works kinda like a main function
            <div id="todo-list"> 
                <p>the busiest people have the most leisure...</p>
                <ul>{todos}</ul>
            </div>
            );


    }//component rendering
}

嵌套组件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//Creating TodoItem component

var TodoItem = class App extends React.Component{

  DeleteItem(){
    console.log(this); //trying to log the item outputs undefined
    this.props.onDelete(this.props.item);
  }

  render(){
    return(
      <li>
        <div className="todo-item">
          <span className="item-name">{this.props.item}</span>
          <span className="item-delete" onClick={this.DeleteItem}>X</span>
        </div>
      </li>
    );
  }
}

当我点击X时,我得到"TypeError: Cannot read property 'props‘of undefined“。我怎么才能解决这个问题,并真正成功地删除对象呢?

EN

回答 3

Stack Overflow用户

发布于 2020-04-21 19:25:38

您的代码中有几个问题。

  1. 类定义

或者使用类组件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class TodoItem extends React.Component {
}

或函数组件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const TodoItem = ({...}) => {
 return (
   <li>
    ...
   </li>
 )
}

函数组件必须以不同的方式编写,并且没有this对象。所以可以先使用类组件

  1. DeleteItem method

常识是在开始时使用小字符,以便deleteItem,但这不是问题。标准方法不受此约束,因此您必须手动执行此操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <span className="item-delete" onClick={this.DeleteItem.bind(this)}>X</span>

更好和更简单的解决方案是使用箭头函数,该函数将自动绑定。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  DeleteItem = () => {
    console.log(this); //trying to log the item outputs undefined
    this.props.onDelete(this.props.item);
  }
票数 0
EN

Stack Overflow用户

发布于 2020-04-21 19:27:11

您没有在构造函数内部绑定this.onDeletethis.DeleteItem。您可以对您各自的2个组件执行this.onDelete = this.onDelete.bind(this);this.DeleteItem = this.DeleteItem.bind(this);。请参考以下代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var El2 = class App extends React.Component {
  constructor(props) {
    //constructor
    super(props);
    this.state = {
      todos: ["work out", "eat breakfast", "take a shower"]
    };
    this.onDelete = this.onDelete.bind(this);
  }

  /**********methods**********/

  onDelete(item) {
    console.log(item, this.state.todos);
    let updatedTodos = this.state.todos.filter((val, index) => {
      return item !== val;
    });
    this.setState({ todos: updatedTodos });
  }

  /********rendering method*******/

  render() {
    let todos = this.state.todos;
    todos = todos.map((item, index) => {
      return <TodoItem item={item} key={index} onDelete={this.onDelete} />;
    });

    return (
      //works kinda like a main function
      <div id="todo-list">
        <p>the busiest people have the most leisure...</p>
        <ul>{todos}</ul>
      </div>
    );
  } //component rendering
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var TodoItem = class App extends React.Component {
  constructor(props) {
    super(props);
    this.DeleteItem = this.DeleteItem.bind(this);
  }

  DeleteItem() {
    console.log(this.props); //trying to log the item outputs undefined
    this.props.onDelete(this.props.item);
  }

  render() {
    return (
      <li>
        <div className="todo-item">
          <span className="item-name">{this.props.item}</span>
          <span className="item-delete" onClick={this.DeleteItem}>
            X
          </span>
        </div>
      </li>
    );
  }
};
票数 0
EN

Stack Overflow用户

发布于 2020-04-21 19:52:29

您需要查看有关端口和组件https://pt-br.reactjs.org/docs/components-and-props.html的更多信息

我还建议不要创建这样的类。今天,react推荐制作功能组件。

如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React, { useEffect, useState } from "react";

function App(){

const [todos, setTodos] = useState("");           ** hooks to create state**

 useEffect(() => {
                                        ** acess life cicle 
  }, [todos])                           **in this array is variable react obrseve to update**

----heres come your functions ------

return(
   <div id="todo-list"> 
    <p>the busiest people have the most leisure...</p>
    <ul>{todos}</ul>
  </div>
){

 }
}
´´´´
See in documentation about hook in link 
<https://pt-br.reactjs.org/docs/hooks-intro.html> 
has an example similar to what you are trying to do. 
I went a little far in explaining it but I believe it is useful.

I hope I helped.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61351303

复制
相关文章
如何在Flask中实现可视化?
首先,我们web端想要去显示一些可视化的数据,我们肯定调用别人写好的库是最好的,有哪些呢?
Python进击者
2021/05/31
1.5K0
Flask 模板控制语句 if for
Flask在模板中有常用的几种控制语句: if控制语句 for控制语句 下面来看看示例加强理解,如下: 模板中的if控制语句 1. 示例视图函数 @app.route('/user') def user(): user = 'libai' return render_template('user.html',user=user) 2.示例模板 <html> <head> {% if user %} <title> hello {{user}} </title>
Devops海洋的渔夫
2019/12/24
5670
在CentOS(Linux)中添加单个IP和批量添加多个IP地方法
1、普通方法: 在/etc/sysconfig/network- s/中新建文件ifcfg-eth0-range0
Inkedus
2020/04/16
4.6K0
在CentOS(Linux)中添加单个IP和批量添加多个IP地方法
在/etc/sysconfig/network- s/中新建文件ifcfg-eth0:*,*为数字序号,多个IP则依次增大 以0为例,建立文件ifcfg-eth0:0
雾海梦曦
2022/11/14
3.7K0
如何在系统中添加字体(添加字体到系统)
笔者最近在使用win10自带的OneNote笔记本记笔记的时候,发现笔者电脑中没有华文新魏这个字体,最开始以为是OneNote不带有这个字体,经过一段时间的收集资料后发现,是笔者电脑win10系统中不带有这个字体,现将有关概念和字体安装方法做一下记录。
全栈程序员站长
2022/08/01
3.9K0
如何在系统中添加字体(添加字体到系统)
winfrom如何在listview中添加控件
private Button btn = new Button(); private void Form1_Load(object sender, EventArgs e) { ListViewItem[] lvs = new ListViewItem[3]; lvs[0] = new ListViewItem(new string[] { "行1列1", "行1列2", "" }); l
码农阿宇
2018/04/18
2.6K0
如何在Hue中添加Spark Notebook
CDH集群中可以使用Hue访问Hive、Impala、HBase、Solr等,在Hue3.8版本后也提供了Notebook组件(支持R、Scala及python语言),但在CDH中Hue默认是没有启用Spark的Notebook,使用Notebook运行Spark代码则依赖Livy服务。在前面Fayson也介绍了《Livy,基于Apache Spark的开源REST服务,加入Cloudera Labs》、《如何编译Livy并在非Kerberos环境的CDH集群中安装》、《如何通过Livy的RESTful API接口向非Kerberos环境的CDH集群提交作业》、《如何在Kerberos环境的CDH集群部署Livy》、《如何通过Livy的RESTful API接口向Kerberos环境的CDH集群提交作业》、《如何打包Livy和Zeppelin的Parcel包》和《如何在CM中使用Parcel包部署Livy及验证》,本篇文章Fayson主要介绍如何在Hue中添加Notebook组件并集成Spark。
Fayson
2018/11/16
6.8K1
如何在python文件中测试sql语句
在manage.py的同级目录下新建一个run.py import os if __name__ == '__main__': #加载Django项目的配置信息 os.environ.setdefault("DJANGO_SETTINGS_MODULE","myblog.settings") #导入Django,并启动Django项目 import django django.setup()  #导入相应的models from person import models  #测试s
西西嘛呦
2020/08/26
1.8K0
mysql添加索引语句_mysql 添加索引语句
mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
全栈程序员站长
2022/09/05
5.5K0
如何在ModelSim中添加Xilinx仿真库
今天给大侠带来在FPGA设计应用中如何在ModelSim中添加Xilinx仿真库,话不多说,上货。
FPGA技术江湖
2020/12/30
5.2K1
如何在Vue中动态添加类名
能够向组件添加动态类名是非常强大的功能。它使我们可以更轻松地编写自定义主题,根据组件的状态添加类,还可以编写依赖于样式的组件的不同变体。
前端小智@大迁世界
2020/05/12
6.2K0
如何在 PHP 中运行 bind_param() 语句?
在PHP中,bind_param()函数是一种准备SQL语句并绑定参数的方法。它通常与预处理语句(prepared statements)一起使用,用于执行数据库操作。bind_param()函数可防止SQL注入攻击,并帮助提高代码的安全性。
七辰
2023/10/04
1.5K0
mpvue小程序单个页面添加config配置[设置标题、下拉刷新、颜色等]
前面有说到wepy和mpvue的区别,所以这段时间一直在用mpvue开发了,今天遇到一个问题,mpvue的下拉刷新配置了居然不生效,也是很无赖。
Javanx
2019/09/04
1.3K0
mpvue小程序单个页面添加config配置[设置标题、下拉刷新、颜色等]
20. Flask 模板控制语句 if for
Flask在模板中有常用的几种控制语句: if控制语句 for控制语句 下面来看看示例加强理解,如下: 模板中的if控制语句 1. 示例视图函数 @app.route('/user') def user(): user = 'libai' return render_template('user.html',user=user) 2.示例模板 <html> <head> {% if user %} <title> hello {{user}} </title>
Devops海洋的渔夫
2022/01/14
2310
条码软件中如何在边框上添加文字
很多用户在使用条码标签软件设计制作标签时,会有自己的一些个性化的需要,虽然条码软件不能和作图软件相比,但是很多效果还是可以通过一些小技巧来实现的。比如下面要给大家介绍的把文字压在边框上的效果。如下图所示。
神奇像素科技
2022/03/01
2.7K0
条码软件中如何在边框上添加文字
如何在 TypeScript 中为对象动态添加属性?
在 TypeScript 中,我们经常需要在运行时动态添加属性到对象上。这是因为 TypeScript 是一种静态类型语言,类型系统在编译时会检查代码的类型安全性,所以在编译时我们无法确定对象上将要添加哪些属性。在本文中,我们将讨论如何在 TypeScript 中为对象动态添加属性,以及这样做的一些注意事项。
网络技术联盟站
2023/06/07
11.7K0
如何在README.md文件中添加图片
1、在github上的仓库建立一个存放图片的文件夹,文件夹名字随意。如:img-folder
挥刀北上
2021/03/10
6.1K0
如何在README.md文件中添加图片
如何在Eclipse中添加Tomcat的jar包
右键项目工程,点击Java Build Path 点击Add Library,选择Server Runtime 选择Tomcat版本 此时就看到拥有了Tomcat的jar包了
用户1154259
2018/01/17
2.8K0
如何在Eclipse中添加Tomcat的jar包
如何在WordPress中添加图片放大预览效果
这里分享一个如何在Wordpress中开启点击图片预览的功能。操作也非常的简单,只需要把下面的内容黏贴到对应的文件中即可。实际的效果预览
兔云小新LM
2023/09/11
3710
如何在WordPress中添加图片放大预览效果
点击加载更多

相似问题

如何在flask中添加后台线程?

36

如何在java中模拟单个语句

13

如何在Flask 1.0.4中启用/配置Jinja行语句?

11

如何在单个UPDATE语句(Oracle)中添加正在运行的ID

14

如何在Flask代码中添加链接转发

19
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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