React (三) 修改props,React父传子、子传父、this绑定

React Props 原理理解 文章目录props chidren模式操作 props props 是 React 组件通信最重要的手段 props:对于在 React 应用中写的子组件,父组件绑定在它们标签里的 属性和方法,最终会变成 props 传递给它们。 1)props 可以是: ① props 作为一个子组件渲染数据源。 ② props 作为一个通知父组件的回调函数。 ③ props 作为一个单纯的组件传递。 ④ props 作为渲染函数。 ⑤ render props , 和④的区别是放在了 children 属性上。 ⑥ 阅读详情

什么是 props

props 可以看成一个对外的接口,用来接收外部传入的数据。组件中主要有两种属性 props 和 state 无论 props 或者 state 中哪两个发生了改变都会重新引发渲染

如何使用

如果你使用过 Vue,也肯定使用过父传子和子传父的功能,在 react 中也有父子通信。

父传子

函数组件

上一篇文章我讲述了使用[...props] 来进行传值,那是一种简写。

// 父组件
function Component1(){
    // 创建一个ref
    const porps = {name: 'ccc',age:18};
  	const a = {h: 'ccc'};
    return (
        <div style={divStyles} title={divTitles} className="App" tab-index="1">
            <User {...porps} />    {/* 使用简写 */}
            <User name='我没有用简写' age='18' />
              {/* 如果是非字符串 就要用大括号*/}
						<User name='我没有用简写' age='18' title={a}/>
        </div>
    );
}
// 通过参数去接受值
function User(props){
    return(
        <div>
            <h2>我是user组件</h2>
            <p>{props.name}---{props.age}</p>
        </div>

    );
}

上面的代码中就是简写和非简写的区别。可以直接在组件编写属性的方式传参数,在用 props 去接收参数。

我们都知道react在没有 hook 之前他们两个的区别主要在于有无 state 和生命周期,类组件可以使用生命周期和构造函数,而函数组件中只有 props,函数组件也称为无状态组件。类组件如果有 state 就是有状态组件,没有 state 就是无状态组件。如果类组件没有 state 推荐使用函数组件(函数组件效率高于类组件)。有了 hook 之后 在函数组件组件里面也可以使用 state。

类组件

类组件中如何传值

// 定义一个函数组件和写内联样式
// 父组件
function Component1(){
    // 创建一个ref
    const porps = {name: 'ccc',age:18};
  	const a = {h: 'ccc'};
    return (
        <div style={divStyles} title={divTitles} className="App" tab-index="1">
            <User {...porps} />    {/* 使用简写 */}
            <User name='我没有用简写' age='18' />
              {/* 如果是非字符串 就要用大括号*/}
						<User name='我没有用简写' age='18' title={a}/>
        </div>
    );
}

// 类组件 props 被实例化了 可以直接使用this.去访问之后在结构
class Footer extends React.Component {
    render() {
        const {name,age} =this.props;
        return(
            <div>
                <h1>我是一个类组件{name}---{age}</h1>
            </div>
        );
    }
}

默认值

可以通过 defaultProps 设置默认值

// 父组件
function Component1(){
    // 创建一个ref
    const porps = {name: 'ccc',age:18};
  	const a = {h: 'ccc'};
    return (
        <div style={divStyles} title={divTitles} className="App" tab-index="1">
            
            <User/>
              {/* 如果是非字符串 就要用大括号*/}
						<User name='我没有用简写' age='18' title={a}/>
        </div>
    );
}

// 子组件
function User(props){
    return(
        <div>
            <h2>我是user组件</h2>
            <p>{props.name}---{props.age}</p>
        </div>

    );
}

User.defaultProps = {
    age: 20,
    name: 'xxx'
};

子传父

props 可以接受任意类型的值。我们可以利用这个特性来实现子组件到父组件的传值,我们可以传递一个函数,通过函数传参的方式,来实现这一功能。这里使用的 this 绑定方式这里查看介绍

// 父组件
function Component1(){
    // 创建一个ref
    const userRef = React.createRef();
    const porps = {name: 'ccc',age:18};
    function getData(data){
        console.log('我是接受接受到子组件的值', data);
    }
    return (
        <div style={divStyles} title={divTitles} className="App" tab-index="1">
            <Footer {...porps} getData={getData} ref={userRef}></Footer>
        </div>
    );
}


// 子组件
class Footer extends React.Component {
    constructor(props){
        super(props);
        // 组件内部的状态 通过 setState 方法来更改的
        this.state = {
            name1:props.name+'ttt',
            num: 0
        };
    }
    add = () => {
        this.setState(state =>({
            num: ++state.num,
        }));
        this.props.getData(this.state.num);
    }
    render() {
        const {name,age} =this.props;
        return(
            <div>
                <h1>我是一个类组件{this.state.name1}---{age}</h1>
                <button onClick={this.add}>点我加一{this.state.num}</button>
            </div>
        );
    }
}

修改 props

在 React 中我们不能直接修改 props

// 子组件
function User(props){
  props.name = 'ttt';
    return(
        <div>
            <h2>我是user组件</h2>
            <p>{props.name}---{props.age}</p>
        </div>

    );
}
// 第三行报错

上面的代码会报错,props 是个只读属性。在 react 中数据流是单向的,不能改变一个组件在渲染是传进来的 props。因为组件会复用,如果可以修改 props,结果会不可预测,也违背了组件的设计原则,但是这并不代表在 props 不能修改**。**

可以通过 state 来变相修改 props。state 可以理解为中间人,主要是利用了 react 里面的重新渲染(setState)方式把props传入到组件中,在通过赋值到 state,在来修改。

// 父组件
function Component1(){
    const userRef = React.createRef();
    const porps = {name: 'ccc',age:18};
    return (
        <div style={divStyles} title={divTitles} className="App" tab-index="1">
            <Footer {...porps} ref={userRef}></Footer>
        </div>
    );
}

// 子组件
class Footer extends React.Component {
  // constructor是构造器函数,如果没有申明,会自动添加,而且只会执行一次
  constructor(props){
  	super(props);
    // 组件内部的状态 通过 setState 方法来更改的
    this.state = {
    	name1:props.name+'ttt'
    }
  }
    render() {
        const {name,age} =this.props;
        return(
            <div>
                <h1>我是一个类组件{this.state.name1}---{age}</h1>
            </div>
        );
    }
}

constructor 里面除了修改 props 还可以进行函数绑定

// 父组件
function Component1(){
    const userRef = React.createRef();
    const porps = {name: 'ccc',age:18};
    return (
        <div style={divStyles} title={divTitles} className="App" tab-index="1">
            <Footer {...porps} ref={userRef}></Footer>
        </div>
    );
}

// 子组件
class Footer extends React.Component {
    constructor(props){
        super(props);
        // 组件内部的状态 通过 setState 方法来更改的
        this.state = {
            name1:props.name+'ttt',
            num: 0
        };
        this.add = this.add.bind(this);
    }
    add(){
        this.setState(state =>({
            num: ++state.num,
        }));
    }
    render() {
        const {name,age} =this.props;
        return(
            <div>
                <h1>我是一个类组件{this.state.name1}---{age}</h1>
                <button onClick={this.add}>点我加一{this.state.num}</button>
            </div>
        );
    }
}

事件监听 this 绑定

this 一共有四种绑定方式,一种就是我上面说的在 constructor 使用 bind 绑定。而且这种方法也是官方推荐的。

下面我来介绍其他三种

直接在 jsx 元素上进行绑定(不推荐)

// 父组件
function Component1(){
    const userRef = React.createRef();
    const porps = {name: 'ccc',age:18};
    return (
        <div style={divStyles} title={divTitles} className="App" tab-index="1">
            <Footer {...porps} ref={userRef}></Footer>
        </div>
    );
}

// 子组件
class Footer extends React.Component {
    constructor(props){
        super(props);
        // 组件内部的状态 通过 setState 方法来更改的
        this.state = {
            name1:props.name+'ttt',
            num: 0
        };
    }
    add(){
        this.setState(state =>({
            num: ++state.num,
        }));
    }
    render() {
        const {name,age} =this.props;
        return(
            <div>
                <h1>我是一个类组件{this.state.name1}---{age}</h1>
                <button onClick={this.add.bind(this)}>点我加一{this.state.num}</button>
            </div>
        );
    }
}

上面代码中我们直接在 button 上进行了绑定。但是这样子会出现一个问题,就是每次在渲染组件的时候,都会创建一个新的函数。会造成额外的渲染,影响性能。

箭头函数(推荐)

使用了 ES6 的类字段

// 父组件
function Component1(){
    const userRef = React.createRef();
    const porps = {name: 'ccc',age:18};
    return (
        <div style={divStyles} title={divTitles} className="App" tab-index="1">
            <Footer {...porps} ref={userRef}></Footer>
        </div>
    );
}

// 子组件
class Footer extends React.Component {
    constructor(props){
        super(props);
        // 组件内部的状态 通过 setState 方法来更改的
        this.state = {
            name1:props.name+'ttt',
            num: 0
        };
    }
    add = () => {
        this.setState(state =>({
            num: ++state.num,
        }));
    }
    render() {
        const {name,age} =this.props;
        return(
            <div>
                <h1>我是一个类组件{this.state.name1}---{age}</h1>
                <button onClick={this.add}>点我加一{this.state.num}</button>
            </div>
        );
    }
}

因为箭头函数本身没有 this 属性,所以他的 this 指向的是 Footer 这个类本身,这个方法是推荐的因为不会存在多重绑定的问题。

直接在 jsx 上使用箭头函数(不推荐)

// 父组件
function Component1(){
    const userRef = React.createRef();
    const porps = {name: 'ccc',age:18};
    return (
        <div style={divStyles} title={divTitles} className="App" tab-index="1">
            <Footer {...porps} ref={userRef}></Footer>
        </div>
    );
}

// 子组件
class Footer extends React.Component {
    constructor(props){
        super(props);
        // 组件内部的状态 通过 setState 方法来更改的
        this.state = {
            name1:props.name+'ttt',
            num: 0
        };
    }
    add = () => {
        this.setState(state =>({
            num: ++state.num,
        }));
    }
    render() {
        const {name,age} =this.props;
        return(
            <div>
                <h1>我是一个类组件{this.state.name1}---{age}</h1>
                <button onClick={() => {
                    this.setState(state =>({
                        num: ++state.num,
                    }));
                }}>点我加一{this.state.num}</button>
            </div>
        );
    }
}

直接在 jsx 上使用箭头函数会导致和直接在 jsx 上进行绑定一样的问题就是每次在渲染组件的时候,都会创建一个新的函数。会造成额外的渲染,影响性能。事件只要是在 render 上绑定事件都会出现性能问题。

Vue 3 中 Web Components 集成实战:ignoredElements、defineCustomElement 与 v-model 双向绑定 Web Components 是浏览器原生的组件化标准,基于 Custom Elements、Shadow DOM 和 HTML Templates 三大基石,提供跨框架复用能力。其核心原理是通过 customElements.define() 注册类,在 HTML 中以自定义标签形式声明式使用,并由浏览器原生解析与实例化。技术价值在于解耦框架依赖、统一设计系统、支撑微前端落地。典型应用场景包括政务系统中 Angular 与 Vue 混合开发、第三方 SDK 强制嵌入、以及企业级 UI 组件库对外输出。在 阅读详情

相关推荐

别再死磕官方文档了!用宿舍开黑的故事,5分钟搞懂Autosar CanNM网管报文

本文通过宿舍开黑游戏的生动类比,深入浅出地解析了Autosar CanNM网管报文的工作原理。从游戏队友协作到汽车ECU节点的同步机制,详细介绍了网管报文的唤醒流程、通信协议及休眠策略,帮助读者快速掌握这一关键技术。

weixin_30463341的博客 262

React之props详解

1.props是正常是外部传入的,组件内部也可以通过一些方式来初始化的设置,属性不能被组件自己更改,但是你可以通过父组件主动重新渲染的方式来传入新的 props纯函数:输入一定,输出一定确定总的来说,在使用一个组件的时候,可以把参数放在标签的属性当中,所有的属性都会作为组件props对象的键值,但是不能直接更改 props。3.通过函数创建的组件,需要通过函数的参数来接收props,通过类创建的组件,需要通过this.props来接收。

subsistent的博客 3918

人形机器人专题:人形机器人关节,从Optimus选型看关节的发展

今天分享的是深度研究报告:《(报告出品方:中泰页。

GPT20236688的博客 3226

React的props基本使用及注意事项

props的基本使用 import React from 'react'; /** 子组件 */ class Person extends React.Component { render() { {/** 在this.props中接收来自父组件的参数 */} const { name, age, sex } = this.props return ( <ul> <li>姓

秋来九月八 2197

MTK平台 MT6789 烧录 efuse 3.0 Configuration SOP

=====================生成cert1和cert2 key===============================================生成efuse key相关文件===========================================签名DA==========================================================正常编译。=====================Security3.0 的SOP 说明。

a785722173的博客 2332

AI时代,程序员何去何从?别慌,看完这篇你就明白了

AI时代程序员的发展方向 摘要:随着AI代码助手的普及,程序员行业面临变革。本文通过实际案例展示AI写代码的能力与局限:AI能生成基础功能代码(如RESTful API、数据处理脚本),但缺乏业务理解、系统设计和复杂逻辑处理能力。程序员的核心价值在于需求分析、架构设计、性能优化等高层能力。未来程序员应: 掌握AI工具提升效率 专注于创新和架构设计 培养业务理解能力 持续学习新技术 AI不会取代程序员,但会淘汰不会使用AI的程序员。建议开发者拥抱AI工具,将其作为助手而非威胁,聚焦高价值工作。

yunque_xianguang的博客 908

React(一)——组件以及Props

react组件/props

我是我 1295

DQN网络代码调用env.reset()后存储观测信息报错问题ValueError: setting an array element with a sequence.解决处理

**reset()函数返回的是一个array类型以及其中数据的type!模拟游戏进行学习任务。因此需要将observation指定为真正需要的array信息即可,得到的的变量observation类型与Agent存储时的。因此怀疑返回的observation有问题,于是通过。报错信息提示为数据维度不对应,也即最初通过。在强化学习DQN网络代码实现过程中,针对。

Vulcan_Q的博客 4093

react - 定义组件 - Props

react - 定义组件 - Props

weixin_57135131的博客 1744

RT-DETR 跨模态检测改进:融合红外数据提升 R50 夜间检测效果

本文提出跨模态自适应融合RT-DETR(CMF-RTDETR-R50),通过双分支骨干网络、可变形模态对齐和门控注意力融合三大模块,将红外数据融入RT-DETR-R50检测器,显著提升夜间目标检测性能。该方法在夜间场景下mAP@0.5提升11.7%,小目标检测AP_S提升15.3%,同时保持实时性(38 FPS)。关键技术包括:1)独立提取可见光与红外特征;2)可变形卷积解决模态对齐问题;3)动态门控机制自适应融合双模态特征。该方案适用于安防监控、自动驾驶等夜间检测场景,为跨模态实时检测提供实用解决方案。

走向CTO的路上... 1448

华为OD机试双机位C卷:挑选宝石 (C/C++/Python/JAVA/JS/GO)

华为OD机试双机位C卷 挑选宝石,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试-挑选宝石,华为OD机考-挑选宝石。

qq_45776114的博客 1500

【React函数组件&类组件的props属性】

React框架规定Props是不能被修改的, 也就是说Props是个只读的参数。3、可以通过’组件名.defaultProps={ default: 值 }’ 方式来设置类组件的props属性值。2、在类组件的构造方法中必须使用super(props)完成父类的构造。注意:'属性名’就是参数名,会封装到props中。1、用于React函数组件的参数的输入。1、类组件默认含有props属性。3、props属性是只读的。// 1、获取页面的元素。// 2、定义函数组件。

橙子的博客 1774

第10集:AIOps 平台架构设计!画出面试官最想看的系统全景图

本文介绍了如何将AIOps平台的六大功能模块整合为四层架构设计,并生成专业系统全景图。文章首先指出面试中架构设计能力的重要性,强调一张清晰的架构图能直观展现全局观。随后指导读者检查项目结构,准备绘图环境。核心部分详细拆解了四层架构:数据采集层(Prometheus、ELK等)、AI分析层(巡检、告警、预测等)、决策执行层(工作流引擎、自愈Agent)和展示交互层(API、控制台)。通过Python代码自动生成模块依赖关系图,并提供了面试讲解技巧。全文旨在帮助开发者在面试中系统性地展示项目架构设计能力。

qq_2937655951的博客 93

React-组件使用与组件通信

组件使用与组件通信详解

cc2231293148的博客 1543

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

React基础

React基础JSX (JavaScript XML)React组件(分为类组件和函数组件)state和setState()React组件通信 JSX (JavaScript XML) JSX创建React元素 React的属性命名使用驼峰命名 如: class -> className 如果没有子节点 React元素可以直接使用 / 结束 如: 推荐使用小括号包裹JSX 如下列表达式: //创建dom元素 const html = (<div className='my_class_

qq_39062457的博客 511

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

React-学习入门篇-前篇

中this的指向,是this执行时的上下文【发生虚拟渲染然后直接会转移到调用的组件,然后丢失this,所以一开始要用 this.handleClick.bind(this)进行外部的绑定】:创建ref对象 myref = React.createRef() 然后放置入标签当中 ref ={this.myRef} 访问 this.myRef.current。中this的指向,是this定义时的上下文【直接绑定一开始定义的外部函数】Flux是一种思想(MVC) 而redux就是具体的实现方式中的一种。

m0_59137949的博客 404

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【前端】React基础3---React组件2

1.属性是父组件对子组件的数据传输与操作2.状态是组件自己的内部的数据。

m0_53401967的博客 258

前端-react组件之间传值(详解版)

1、使用ref完成父子组件通信(子传父=>父组件可以直接获取子组件中的数据;父传子=>父组件可以利用setState修改即给子组件传值)(只能在类组件中使用) (1)在父组件中导入createRef (2)在类组件中调用createRef (3)在子组件中自定义属性 (4)此时通过this.childRef.current就可以获取到子组件实例对象了 父组件利用this.childRef.current.setState({name:’aaa’})可..

Canace_Xyxjjcaw的博客 2841

React第一期知识点总结(简陋版)

react第一期只是点总结(简陋版)

没有防护服的小白 173

初识react

一、react 特点 1.jsx语言,js语法的扩展 2.虚拟Dom(diff算法) 3.组件化思想 4.单向数据流(状态管理 redux,Mobx,flux) 5.声明式 函数式编程 二、react 技术栈 react + react-router-dom +(状态管理 redux,Mobx,flux)+axios/fetch +ant-design react的使用:最简易的react示例 ReactDOM.render( <h1>Hello, world!&lt

zcl199807的博客 299

React开发 从入门到精通

自定义 Hook 是以usetry {Vue 中通常使用组合式函数(Composable),例如。两者的思想非常接近:把可复用逻辑从组件中抽离。UI 是状态的函数。组件通过 Props 接收输入,通过回调向上沟通。State 更新必须遵循不可变数据原则。Effect 用于同步外部系统,不是普通计算工具。自定义 Hook 用于复用状态逻辑。Context 解决跨层级传值,Zustand 解决更复杂的共享状态。页面、组件、Hook、Store、API 应保持清晰边界。

weixin_44361375的博客 202

React面试题笔记(一)

React面试题笔记(一)

qq_42750608的博客 1249

React 父子组件传值

React 父子组件传值 Hook 父子组件传参

小火车况且况且况且的博客 470

React飞行日记(九) - 复合组件交互

-父子组件交互 1.状态和方法 React中父子组件的交互有两种方式(除去redux) 第一种是靠(状态|属性)完成 父传子:(父组件把其状态,作为子组件属性传入,父状态改变子组件重渲染)【父->子】 子传父:(父组件把其方法,作为子组件属性传入,子组件调用方法影响父组件)【子->父】 2.context上下文 第二种是靠(状态|上下文context)完成 上下文和属性的不同点: 父组件定义上下文,所有后代组件都能使用。(属性只停留在父子组件层面) 每个后代组件中的上下文都是独立

weixin_44038881的博客 304

2021-01-14

React核心知识点 React中的三个属性 state、props、refs React的组件:函数组件(无状态)、类组件(有状态) JSX: 概念: 复合XML规范的JavaScript拓展语法 本质: JSX 不是之间渲染成DOM,而是先转为cereateElement,再渲染 注释: {/* */} 特殊关键字: className代替class,htmlFor代替label标签中的for 语法规则:要使用声明式编码 函数组件和类组件的区别: 有无this 、有无生命周期、有无state 生命周期

qq_48230583的博客 221

前端面试题大全:JavaScript + Vue3 + React + TypeScript + 工程化 + 性能优化

i < 3;i++) {333闭包指:一个函数可以访问并保留自己词法作用域中的变量,即使外层函数已经执行完毕。count++fn() // 1fn() // 2interface → 对象结构、面向对象契约type → 联合类型、交叉类型、元组等复杂类型count?

2301_78815952的博客 327
上一篇: React (二) 虚拟Dom介绍和非Dom的属性介绍
下一篇: ES6基本的语法(十五) 手写 Promise
SteveTang957
博客等级 码龄9年 15粉丝 63原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值