首页 > 其他分享 >React笔记-组件通信(六)

React笔记-组件通信(六)

时间:2023-05-11 18:55:30浏览次数:35  
标签:Component 笔记 React state props 组件 import

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>
    )
  }
}

标签:Component,笔记,React,state,props,组件,import
From: https://www.cnblogs.com/SpicyPeper/p/17391931.html

相关文章

  • 视图组件与路由系统
    目录一、视图组件介绍及两个视图基类两个视图基类APIViewGenericAPIView[通用视图类]get_serializer(self,*args,**kwargs)1.1APIView+ModelSerializer+Resposne写5个接口1.1.1视图类1.1.2序列化类1.1.3路由二、基于GenericAPIView+5个视图扩展类2.1视图类(推导流程)2.2序列......
  • zynqMP调试笔记(包含如何调试U-BOOT)
    创建工程:kunyi02@kunyi02-PC:~/alinx/4ev-p/shao-Alps$petalinux-create-tproject-npetalinux--templatezynqMP配置工程:xsa文件由硬件提供kunyi02@kunyi02-PC:~/alinx/4ev-p/shao-Alps/petalinux$petalinux-config--get-hw-description../hardware/design_......
  • 父与子组件的通信方式
    vue中,父组件与子组件的通信方式VUE父子组件之间通信方式_vue父子组件通信_Johnson_9的博客-CSDN博客一、props通信方式在子组件里给props接收数据,父组件定义数据 二、$emit用法(用$emit方法,使用自定义的方法,获取到参数,父组件能获取到子组件操作,子组件向父组件传递数据)在父组......
  • element ui的el-upload上传组件中使用el-image的图片预览
    问题想在elementui的el-upload上传组件中使用el-image的图片预览,这样就可以放大和缩小还有多张图片切换因为el-upload提供的是使用对话框查看图片,不能放大缩小还不能左右切换说明在el-image组件内的预览功能是使用的el-image-viewer这个小组件实现的,所以我们直接导入调用这......
  • rsync笔记
    1、跨文件系统同步:一方是LINUX使用UTF8字符集,另一方是WINDOWS使用GBK字符集须添加参数,中文同步方正常显示--iconv=utf8,gbk2、文件权限参考这里:https://stackoverflow.com/questions/34147565/rsync-uid-gid-impossible-to-set-cases-cause-future-hard-link-failure-how-t......
  • Lattics:一款简单易用、好看强大的「类脑式」知识管理工具,笔记应用与写作软件二合一
    如何选择一款适合自己的知识管理工具?随着数字化时代的到来,越来越多的人意识到知识管理的重要性。笔记软件和写作软件作为一种常用的知识管理工具,一直以来备受关注。从最早的印象笔记、有道云、为知笔记、幕布mubu到近几年的思源Siyuan、熊掌记Bear、flomo浮墨笔记、石墨、语雀y......
  • vue2+van2 实现带搜索的级联选择组件
    级联选择组件新建组件-子项CasadeSelect/CasadeSelectItem.vue<template><divclass="container-list-item"><divclass="icon"><divclass="checkbox"><svg-iconv-if="curChecked"ic......
  • kubernetes学习笔记27:etcd性能
    理解etcd性能:etcd集群架构图,包含raft层,storage层(storage层包含treeindex层和boltdb底层持久化存储key-value层),它们每一层都可能造成性能损失,raft层需要网络同步数据,网络io节点之间的rtt和带宽都会影响etcd性能,另外wal也会受到磁盘io的写入速度影响。storage层,磁盘iofdatasync延迟......
  • 【C++学习笔记】C++ 正则表达式不完全支持零断宽言
    最近需要解析配置文件,遇到从@STARTDATA@END中提取DATA的正则,按照C#的操作,直接(?<=@START)[\W\w]?(?=@END),就能提取的,可是在C++中,regexe("(?<=@START)[\W\w]?(?=@END)")报错了,找了很多说法,最终结论:支持先行断言,不支持后行断言即:(?<=@START)和(?<!@START)。好在C++支持子匹......
  • 不确定市场需求下的制造业基地布局选址决策笔记
    链接:【250】文献研读|区域经济|不确定市场需求下的制造业基地布局选址决策(qq.com) ......