React入门 - 08(组件拆分组件传值)

本章内容

目录

    • 父组件向子组件传递数据
    • 子组件向父组件传递数据

上一节内容我们补充l了在 React使用 JSX语法的一些细节。本节我们继续使用 ”TodoList“ 案例来讲解一下”组件拆分与组件传值“

父组件向子组件传递数据

  • 打开一开始我们已经创建好的工程,现在我们用”组件化“的思想去改写 TodoList组件

  • 那我们应该怎么去拆分组件呢?打开入口文件 index.js时,我们可以清楚的看到 TodoList就是被当成一个大组件挂载到 id=”root“的元素上。

在这里插入图片描述

  • 界面运行后的显示内容也是 TodoList组件的所有内容,所以最外层的”大组件“我们知道是谁了,那么我们就可以对这个”大组件“进行拆分.
    在这里插入图片描述

  • 组件拆分好后,我们在 src目录下新增一个 TodoItem.js, 按照之前的学习知识,我们在 TodoItem这个组件里写一些初始化的代码

// TodoItem.js 组件import React, { Component } from 'react'
class TodoItem extends Component {render () {return (<div>我是组件 TodoItem</div>)}
}
export default TodoItem
  • 现在我们试着在 TodoList.js组件中引入 TodoItem.js组件
import React, { Component, Fragment } from "react";
import TodoItem from "./TodoItem"; // 1、引入 TodoItem 组件class TodoList extends Component{constructor(props) {super(props) // ES6 的语法this.state = {inputValue: '', list: []}}render() {return (<Fragment><div><input value={this.state.inputValue} onChange={this.changeInputValue.bind(this)} /><button onClick={this.addListData.bind(this)}> 提交 </button></div><ul>{this.state.list.map((item, index) => {// 2、将之前循环 list 数据项时创建的 li 标签注释掉,改为使用 ”组件“的形式来编写代码,这部分代码统一封装在 TodoItem 里// return (<li key={index} onClick={(this.deleteData.bind(this,index))}> {item} </li>)// 3、不渲染 li 标签了,取而代之的是,使用 TodoItem 组件来渲染内容return ( <TodoItem></TodoItem>)})}</ul></Fragment>)}deleteData(index) {const list = [...this.state.list]list.splice(index, 1)this.setState({list: list})}addListData() {this.setState({list: [...this.state.list, this.state.inputValue]})this.setState({inputValue: ''})}changeInputValue(e) {this.setState({inputValue: e.target.value})}
}export default TodoList
  • 运行一下代码,我们会发现有了效果,也没有报错(有一个让添加 key的警告,我们后续再解决)。但我们发现列表显示的内容并不是我们输入框输入的内容,而是组件 TodoItem里的内容
    在这里插入图片描述

  • 那怎么样才能将输入框的数据传到组件 TodoItem里并正确显示呢?这就要使用到”组件间传值“的知识点嘞

  • 如图所示,实际开发过程中,我们会将复杂的界面拆分成一个”组件树“。组件间存在着各种关系(父子、祖先、相邻等)。而在我们本章案例里的 TodoListTodoItem属于父子关系
    在这里插入图片描述

  • React中,父组件可以通过”属性“的形式向子组件进行传递数据。所以如果 TodoList要将 input输入框的数据传递给 子组件 TodoItem,可以直接定义一个 TodoItem的任意属性,然后通过这个属性进行传值

import React, { Component, Fragment } from "react";
import TodoItem from "./TodoItem";class TodoList extends Component{constructor(props) {super(props) // ES6 的语法this.state = {inputValue: '', list: []}}render() {return (<Fragment><div><input value={this.state.inputValue} onChange={this.changeInputValue.bind(this)} /><button onClick={this.addListData.bind(this)}> 提交 </button></div><ul>{this.state.list.map((item, index) => {// 在 map 方法中,回调函数的第一个“形参”即为列表(数组)的“每一项 item”,我们又规定了回调函数返回的内容就是这个“每一项 item”。// 所以,我们把“每一项 item”起名为 content,并以“属性”的形式传给“子组件 TodoItem”return ( <TodoItem content={item}></TodoItem>)})}</ul></Fragment>)}deleteData(index) {const list = [...this.state.list]list.splice(index, 1)this.setState({list: list})}addListData() {this.setState({list: [...this.state.list, this.state.inputValue]})this.setState({inputValue: ''})}changeInputValue(e) {this.setState({inputValue: e.target.value})}
}export default TodoList
  • 相应的,在 React中,子组件可以通过 this.props.属性的形式来接收父组件传递的数据
import React, { Component } from 'react'class TodoItem extends Component {render () {return (<div>{/* 子组件可以通过 this.props.属性 的形式来接收父组件传递的数据 */}{this.props.content}</div>)}
}export default TodoItem
  • 接着我们再次运行界面,发现输入框输入啥内容提交后,界面就相应的显示其内容数据
    在这里插入图片描述

子组件向父组件传递数据

  • 紧着着上面的代码,我们要接着实现”当点击列表中的某项内容时,该内容从列表中删除“

  • 首先按照需求,我们应该在列表项上绑定一个点击事件。如今的列表项已经被拆成了”小组件“ TodoItem, 所以我们要打开 TodoItem.js文件,去给相应的元素绑定点击事件

import React, { Component } from 'react'class TodoItem extends Component {render () {return (// 1、绑定点击事件<div onClick={this.handleClick.bind(this)}>{this.props.content}</div>)}// 2、点击事件的逻辑放在 handleClick 方法中handleClick() {}
}export default TodoItem
  • ”点击事件“绑定后,我们继续分析以下问题
1、需要确定点击的是列表的哪一项---------可以通过 map 的 index 来确定点击哪一项,并传给 TodoItem 组件2、通过 index 知道点击的是哪一项后,就要考虑怎么把该项从列表中删除-------子组件TodoItem 的某项被点击时,实质上是将父组件TodoList的”list 数据某项删除“。在父组件中,已经定义了一个删除的方法 ”deleteData“,那么我们可以把这个方法通过属性传值方式传给子组件 TodoItem ,然后子组件自己触发”点击事件“的方法中就可以直接调用父组件传递过来的”删除方法“
  • 按照这个思路,我们来编写代码
// TodoList.js 组件
import React, { Component, Fragment } from "react";
import TodoItem from "./TodoItem";
class TodoList extends Component{constructor(props) {super(props) // ES6 的语法this.state = {inputValue: '', list: []}}render() {return (<Fragment><div><input value={this.state.inputValue} onChange={this.changeInputValue.bind(this)} /><button onClick={this.addListData.bind(this)}> 提交 </button></div><ul>{this.state.list.map((item, index) => {// 1、传递 item 给子组件用于内容渲染// 2、传递 index 给子组件,让子组件触发自身的删除事件时,知道是哪一项被删除// 3、传递 deleteData 方法给子组件,让子组件触发自身的删除事件时进行调用return ( <TodoItem content={item} index={index} deleteFn={this.deleteData.bind(this)}></TodoItem>)})}</ul></Fragment>)}deleteData(index) {const list = [...this.state.list]list.splice(index, 1)this.setState({list: list})}addListData() {this.setState({list: [...this.state.list, this.state.inputValue]})this.setState({inputValue: ''})}changeInputValue(e) {this.setState({inputValue: e.target.value})}
}
export default TodoList// TodoItem.js 组件
import React, { Component } from 'react'
class TodoItem extends Component {render () {return (<div onClick={this.handleClick.bind(this)}>{this.props.content}</div>)}handleClick() {// 4、调用从父组件中传递过来的删除方法,传入删除项的 index this.props.deleteFn(this.props.index)}
}
export default TodoItem
  • 运行界面,发现删除功能完美实现

到此,本章内容结束!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/418527.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

极狐GitLab 线下『 DevOps专家训练营』成都站开班在即

成都机器人创新中心联合极狐(GitLab)隆重推出极狐GitLab DevOps系列认证培训课程。该课程主要面向使用极狐GitLab的DevOps工程师、安全审计人员、系统运维工程师、系统管理员、项目经理或项目管理人员&#xff0c;完成该课程后&#xff0c;学员将达到DevOps的专家级水平&#x…

算法训练 day24 | 77. 组合

77. 组合 题目链接:组合 视频讲解:带你学透回溯算法-组合问题 回溯其实和递归是密不可分的&#xff0c;解决回溯问题标准解法也是根据三部曲来进行的。 1、递归函数的返回值和参数 对于本题&#xff0c;我们需要用一个数组保存单个满足条件的组合&#xff0c;还需要另一个结果数…

Bit.Store 加密卡集成主流 BRC20通证,助力 BTC 生态流动性

“Bit.Store 首创性的将包括 ORDI、SATS、以及 RATS 在内的主流 BRC20 资产集成到其加密卡支付中&#xff0c;通过以其推出的加密银行卡为媒介&#xff0c;助力 BTC 生态 Token 的流动性与消费。” 比特币网络在被设计之初&#xff0c;就是以一种去中心化、点对点的现金系统为定…

数据结构之二叉树的性质与存储结构

数据结构之二叉树的性质与存储结构 1、二叉树的性质2、二叉树的存储结构 数据结构是程序设计的重要基础&#xff0c;它所讨论的内容和技术对从事软件项目的开发有重要作用。学习数据结构要达到的目标是学会从问题出发&#xff0c;分析和研究计算机加工的数据的特性&#xff0c;…

python写完程序怎么运行

python有两种运行方式&#xff0c;一种是在python交互式命令行下运行; 另一种是使用文本编辑器直接在命令行上运行。 注&#xff1a;以上两种运行方式均由CPython解释器编译运行。 当然&#xff0c;也可以将python代码写入eclipse中&#xff0c;用JPython解释器运行&#xff0c…

用el-image-viewer实现全局预览图片

背景 在后台管理系统中&#xff0c;一些预览图片的场景&#xff0c;通常都是使用 el-image-viewer 去实现&#xff0c;但是如果多个地方都需要预览图片&#xff0c;又要重复的去写 el-image-viewer 以及一些重复的和预览相关的代码。 可以把预览图片的组件放在根文件&#x…

MySQL主从集群

MySQL主从集群 主从模式、集群模式&#xff0c;都是在一个项目中使用多个mysql节点进行存储和读取数据。 当单机模式部署&#xff0c;不满足安全性、高可用、高并发等需求的时候&#xff0c;就需要考虑主从模式或者集群模式部署。 什么是主从模式&#xff1f; 主从模式&…

Hadoop基础知识

Hadoop基础知识 1、Hadoop简介 广义上来说&#xff0c;Hadoop通常是指一个更广泛的概念——Hadoop生态圈。狭义上说&#xff0c;Hadoop指Apache这款开源框架&#xff0c;它的核心组件有&#xff1a; HDFS&#xff08;分布式文件系统&#xff09;&#xff1a;解决海量数据存储Y…

EasyRecovery2024数据恢复大师最新版本下载

EasyRecovery可以从初始化的磁盘恢复损坏或删除的文件。该软有易于使用&#xff0c;即使是最缺乏经验的用户也可以轻松恢复数据。一款威力非常强大的硬盘数据恢复工具。能够帮你恢复丢失的数据以及重建文件系统。EasyRecovery 不会向你的原始驱动器写入任何东东&#xff0c;它主…

Canny边缘检测 双阈值检测理解

问题引入 我们用一个实际例子来引入问题 import cv2 import numpy as npimgcv2.imread("test.png",cv2.IMREAD_GRAYSCALE) # 修改图像大小 show cv2.resize(img,(500,500))v1cv2.Canny(show,120,250) v2cv2.Canny(show,50,100)# 连接图像 res np.hstack((v1,v2)…

b+树的理解

二叉树&#xff1a; 每个节点支持两个分支的树结构&#xff0c;相比于单向链表&#xff0c;多了一个分支。 二叉查找树&#xff1a; 在二叉树的基础上增加了一个规则&#xff0c;左子树的所有节点都小于它的根节点&#xff0c;右子树的所有节点都大于他的根节点。 二叉查找树…

基于JavaWeb+SSM+Vue基于微信小程序的在线投稿系统的设计和实现

基于JavaWebSSMVue基于微信小程序的在线投稿系统的设计和实现 滑到文末获取源码Lun文目录前言主要技术系统设计功能截图 滑到文末获取源码 Lun文目录 目录 1系统概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系统设计思想 1 2相关技术 2 2.1微信小程序 2 2.2 MYSQL数据库 3 2.3 u…