React笔记-组件通信(六)

props概念

props是组件之间通讯的纽带

props也是组件中内置的一个属性

通过父级组件传入 在类组件里 可以直接通过this.props获取

注意:

  • props是不可变的(只读) 修改需要从传值的组件中修改

  • props改变会使视图重新渲染

组件传值

父传子

在父组件里的子组件标签上定义属性 在子组件里使用props接收

// 父组件
import React from "react";
import LearnChild from './learn-child' export default class LearnParent extends React.Component { render () {
return (
<div>
{/* 父类中的子标签中写上属性 在子类中通过props接收 */}
<LearnChild name='bob' age='18'></LearnChild>
</div>
)
}
}
// 子组件
import React from "react"; export default class LearnChild extends React.Component { render () {
return (
<div>
{/* 子类中通过this.props接收父类传值(子类标签属性) */}
<div>{this.props.name} --- {this.props.age}</div>
</div>
)
}
}

子修改父值

子props接收父的一个方法 父通过这个方法改变父类中的值 子每次调用接收到的父的方法 父中方法都会执行 间接改变值

注意:

子proprs接收到父传的值不能在子中被修改 子中只读

// 父组件
import React from "react";
import LearnChild from './learn-child' export default class LearnParent extends React.Component { state = {
age : 18
} add (item) { this.setState({
age : ++item
})
} render () {
console.log(this.state.age)
return (
<div>
{/* 父类中的子标签中写上属性 在子类中通过props接收 */}
<LearnChild name='bob' age={this.state.age} ageChange={(item) => this.add(item)}></LearnChild>
</div>
)
}
}
// 子组件
import React from "react"; export default class LearnChild extends React.Component { addAge (item) {
console.log(this.props.age)
this.props.ageChange(item)
} render () {
return (
<div>
{/* 子类中通过this.props接收父类传值(子类标签属性) */}
<div>{this.props.name} --- {this.props.age}</div>
<button onClick={() => this.addAge(this.props.age)}>age+1</button>
</div>
)
}
}

子传父

父组件给子组件传入一个方法 子组件接收这个方法 在对应的事件里触发接收到的方法 并且可以传参

子传父本质上来说就是通过观察者去触发了一个回调函数

// 父组件
import React from "react";
import LearnChild from './learn-child' export default class LearnParent extends React.Component { add (item) {
console.log('父类接收到: ' + item)
} render () {
console.log(this.state.age)
return (
<div>
<LearnChild name='bob' age={this.state.age} ageChange={(item) => this.add(item)}></LearnChild>
</div>
)
}
}
// 子组件
import React from "react"; export default class LearnChild extends React.Component { addAge (item) {
this.props.ageChange(item)
} render () {
return (
<div>
{/* 子类中通过this.props接收父类传值(子类标签属性) */}
<div>{this.props.name} --- {this.props.age}</div>
<button onClick={() => this.addAge('子传父')}>age+1</button>
</div>
)
}
}

组件嵌套

组件标签中间如果有其他组件或者标签,则在组件内使用this.props.children展示

//父组件
import React from "react";
import Component from "./component";
import Content from "./Content"; export default class LearnPropsChild2 extends React.Component {
render() {
return (
<div>
<Component> {/* 可以放标签 */}
<div>在组件内部的内容</div>
{/* 也可以直接放组件 */}
<Content></Content> </Component>
</div>
);
}
}
// 子组件
import React from "react"; export default class Component extends React.Component {
render() {
return (
<div>
<div>头部</div>
{/* 通过children展示 */}
{this.props.children}
<div>底部</div>
</div>
);
}
}

受控组件

在HTML中 表单标签 值通常是根据用户输入来更新 在React可变状态通常放在组件的state中 并且只能使用setState更新

如果这个组件里面存放着一些表单控件我们也可以手动的进行组件更新 那么以这种由React控制的输入表单元素而改变其值的方式 称为受控组件

// 实例
import React from 'react'
export default class MyInput extends React.Component { state = {
value: 0
} handleChange = (event)=>{
this.setState({
value: event.target.value
})
} render(){
return(
<div>
<input
type="text"
value={this.state.value}
onChange={this.handleChange}
/>
</div>
)
}
}

受控组件更新state流程

  • 可以通过初始state中设置表单的默认值
  • 每当表单的值发生变化时,调用onChange事件处理器
  • 事件处理器通过事件对象event拿到改变后的状态,并更新组件的state
  • 一旦通过setState方法更新state,就会触发视图的重新渲染,完成表单组件的更新

状态提升(同级传值)

概念

多个组件需要共享state数据时 将这些数据提升到父组件中 这就是'状态提升'

这么做的原因

当多个组件渲染同一数据 但是状态各不相同时 这些组件数据需要同步变化 但是组件之间不能相互作用

例如

官网例子: 一个组件用华氏度展示数据A 另一个组件用摄氏度展示数据A 数据相同 但是表现形式不同 并且当数据A被修改时 两个组件需要根据不同展现形式同时变化

import React from "react";

class Son extends React.Component {

  // 1.获取组件自身input值 并传给父组件
change(event) {
this.props.onShow(event.target.value);
} render () {
return (
<div>
<input type="text" onChange={(event) => this.change(event)} value={this.props.data}/>{this.props.unit}
</div>
)
}
} export default class NewState2 extends React.Component { state = {
m : 0,
cm : 0
} changeM(m) {
// 2.接收子组件m传过来的实参 并根据实参改变另一个组件中的数据 达成同步变化
this.setState({
m : m,
cm : m * 100
})
} changeCM(cm) {
// 2.接收子组件cm传过来的实参 并根据实参改变另一个组件中的数据 达成同步变化
this.setState({
m : cm / 100,
cm : cm
})
} render () {
return (
<div>
<Son unit='M' onShow={(m) => this.changeM(m)} data={this.state.m}></Son>
<Son unit='CM' onShow={(cm) => this.changeCM(cm)} data={this.state.cm}></Son>
</div>
)
}
}

React笔记-组件通信(六)的更多相关文章

  1. react的组件通信

    react的组件通信 1.父组件传子组件 import React, {Component} from 'react'class Father extends Component{ render() ...

  2. React之组件通信

    组件通信无外乎,下面这三种父子组件,子父组件,平行组件(也叫兄弟组件)间的数据传输.下面我们来分别说一下: 父子组件: var Demo=React.createClass({ getInitialS ...

  3. React中组件通信的几种方式

    https://segmentfault.com/a/1190000012361461 需要组件之进行通信的几种情况 父组件向子组件通信 子组件向父组件通信 跨级组件通信 没有嵌套关系组件之间的通信 ...

  4. 5.React中组件通信问题

    1.父组件传递值给子组件 想必这种大家都是知道的吧!都想到了用我们react中的props,那么我在这简单的写了小demo,请看父组件 class Parent extends Component{ ...

  5. react 父子组件通信

    import React from 'react'; import B from './B'; class A extends React.Component{ state = { msg:'我来自于 ...

  6. Vue学习笔记-组件通信-子传父(自定义事件)

    props用于父组件向子组件传递数据,还有一种比较常见的是子组件传递数据或事件到父组件中.我们应该如何处理呢?这个时候,我们需要使用自定义事件来完成.什么时候需要自定义事件呢?当子组件需要向父组件传递 ...

  7. Vue学习笔记-组件通信-父传子(props中的驼峰标识)

    在组件中,使用选项props来声明需要从父级接收到的数据.props的值有两种方式:方式一:字符串数组,数组中的字符串就是传递时的名称.方式二:对象,对象可以设置传递时的类型,也可以设置默认值等. & ...

  8. React 入门学习笔记整理(六)—— 组件通信

    1.父子组件通信 1)父组件与子组件通信,使用Props 父组件将name传递给子组件 <GreateH name="kitty"/> 子组件通过props接收父组件的 ...

  9. react第六单元(react组件通信-父子组件通信-子父组件通信-跨级组件的传参方式-context方式的传参)

    第六单元(react组件通信-父子组件通信-子父组件通信-跨级组件的传参方式-context方式的传参) #课程目标 1.梳理react组件之间的关系 2.掌握父子传值的方法 3.掌握子父传值的方法 ...

  10. react初探(二)之父子组件通信、封装公共组件

    一.前言 在组件方面react和Vue一样的,核心思想玩的就是组件,下面举两个组件常用的情景. 场景一:假如我们现在有一个页面包含表格以及多个弹框,这种时候如果将这个页面的业务代码写在一个组件中,那么 ...

随机推荐

  1. Spring设计模式——原型模式

    原型模式 原型模式(Prototype Pattern),是指原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象. 原型模式主要适用于以下场景: 类初始化消耗资源较多 使用new生成一个对象 ...

  2. 在jsp页面int和String类型的相互转换

    浅浅地来做一个对比吧! .java文件 int转成string类型:String s=String.valueOf(int m); String转成int类型:int m=Integer.parseI ...

  3. DES & 3DES 简介 以及 C# 和 js 实现【加密知多少系列】

    〇.简介 1.DES 简介 DES 全称为 Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977 年被美国联邦政府的国家标准局确定为联邦资料处理标准( ...

  4. 使用声网 SDK 构建 Piloteer 助盲服务平台的最佳实践

    前言 在今年声网主办的「RTE2022 编程挑战赛」中,数支队伍经过一个多月的努力开发,很多优秀的作品最终突出重围,斩获大奖.本文由RTE2022编程挑战赛获奖者之一李新春撰写,他主要围绕获奖作品「P ...

  5. Django笔记六之外键ForeignKey介绍

    这一篇笔记介绍 Django 系统 model 的外键处理,ForeignKey 以及相应的处理方法. 这是一种一对多的字段类型,表示两张表之间的关联关系. 本篇笔记的目录如下: on_delete ...

  6. NotionAI - 文档领域的ChatGPT,一款 AI 加持的在线文档编辑和管理工具

    简介 NotionAI - 文档领域的ChatGPT,一款 AI 加持的在线文档编辑和管理工具 作为国际领先的在线文档编辑和管理工具,Notion受到了广大用户的欢迎,尤其是程序员们.它不仅支持笔记. ...

  7. ARC149(A~E)

    Tasks - AtCoder Regular Contest 149 又是114514年前做的题,现在来写 屯了好多,清一下库存 A - Repdigit Number (atcoder.jp) 直 ...

  8. SELinux入门学习总结

    前言 安全增强型 Linux(Security-Enhanced Linux)简称 SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统. SELinux 主要由美国国家 ...

  9. 网络抓包 tcpdump 使用指南

    在网络问题的调试中,tcpdump应该说是一个必不可少的工具,和大部分linux下优秀工具一样,它的特点就是简单而强大.它是基于Unix系统的命令行式的数据包嗅探工具,可以抓取流动在网卡上的数据包. ...

  10. python入门教程之一 什么是python

    python简介 1 什么是python Python是一种计算机程序设计语言.你可能已经听说过很多种流行的编程语言,比如非常难学的C语言,非常流行的Java语言,适合初学者的Basic语言,适合网页 ...