React组件实现越级传递属性

如果有这样一个结构:三级嵌套,分别是:一级父组件、二级子组件、三级孙子组件,且前者包含后者,结构如图:

如果把一个属性,比如color,从一级传递给三级,一般做法是使用props逐一向下传递,代码如下:

// 一级父组件
class Level1 extends React.Component{
    render(){
        return  <Level2 color=‘red‘/>
    }
}
// 二级子组件
class Level2 extends React.Component{
    render(){
        return  <Level3 color={this.props.color}/>
    }
}
// 三级孙子组件
class Level3 extends React.Component{
    render(){
        return  <div color={{color: this.props.color}}/>
    }
}

看代码会发现,level2根本没有用到color,但是为了在level3中使用,它还是不得不写上color={this.props.color}。一是代码冗余,二是如果后期把color改成txt或者增加一个属性,改起来复杂。那么如何把color直接从level1给level3呢?答案是:使用伟大的Context实现越级传递。

直接上代码:

// 一级父组件
class Level1 extends React.Component{
    // ****第2步:给子类共用属性赋值****
    getChildContext() {
        return {color: "red"};
    }
    render(){
        return <Level2/>
    }
}
// ****第1步:定义子类们共用的属性及类型****
Level1.childContextTypes = {
  color: React.PropTypes.string
};

// 二级子组件
class Level2 extends React.Component{
    render(){
        return <Level3/>
    }
}
// 三级孙子组件
class Level3 extends React.Component{
    render(){
        return <div color={{color: this.context.color}}/> // ****第4步:使用this.context接受越级传递的参数****
    }
}
// ****第3步:定义子组件从组件需要接受的属性和类型****
Level3.contextTypes = {
  color: React.PropTypes.string
};

每一步的说明,也都在备注里了,这里就不再一一解读了。

另外,在React+Redux中,Provider组件通过context方式把store传递给所有容器和子组件的方式,底层也是利用了这个原理。

时间: 2024-08-11 09:51:09

React组件实现越级传递属性的相关文章

react组件的数据传递

在react中,为了解决html标签构建应用的不足,将公共的功能单独抽离成一个文件作为一个组件,在使用的地方按需引入,既然是组件彼此调用,就会涉及到父子组件的通信,下面主要来总结简单的组件通信. 1,项目准备 在开始组件通信前,先在components中新建两个文件,News.js和Header.js,并在News.js中引用Header.js,然后在App.js中引入News.js. App.js Header.js News.js 2,父组件给子组件传值 要在子组件中获取父组件传递的值,只需

React 组件传值 父传递儿子

10===> 传递参数 import React from "react" //一定要导入React // 函数类型去创建组件 export function Web1(props){ return <div> 我是以函数的形式创建的组件 <p> {props.name}</p> </div> } // 以类的形式创建组件 这一种传递参数要使用 this 它是挂载到实例上的 export class Web2 extends Rea

react组件渲染的一些想法

最近一直在思考一个问题,react的单向数据流面对深层次组件集合(redux connect方法返回的组件,即一项完整的功能)时,数据该如何传递???redux帮助我们解决了什么问题??? 我使用了redux+react,发现redux并没有解决react组件之间数据传递问题.只是把数据中心化与避免了父组件取子孙组件的数据时那繁琐的回调,却增加了三个麻烦的东西action.reducer.mapStateProps.复杂的处理流程:action里新增一条数据,reducer就需要增加一个对该数据

React组件属性部类(propTypes)校验

React组件属性类型(propTypes)校验 Prop 验证 随着应用不断变大,保证组件被正确使用变得非常有用.为此我们引入propTypes.React.PropTypes 提供很多验证器 (validator) 来验证传入数据的有效性.当向 props 传入无效数据时,JavaScript 控制台会抛出警告.注意为了性能考虑,只在开发环境验证 propTypes.下面用例子来说明不同验证器的区别: React.createClass({ propTypes: { // 可以声明 prop

二、React初体验之React组件创建

(中间因为应付各种考试,处理其他事情,隔了好时间没更新,现在终于有时间了,续上!) 本文为React初始体验,因此先不考虑文件如何组织,尽量以最简单的方式让大家了解React其中的原理. 在创建组件(component)之前,大家首先需要了解一些基础知识.有ES6.JSX语法等基础知识的同学请跳过下面一段. ES6是JavaScript的最新标准,里面新增了许多语法方式,甚至出现了“类”的继承方式,我个人暂且把他们理解为新增了许多“语法糖”,这些“语法糖”可能带给老手的是方便,而对于我们这些菜鸟

React组件间的通信

1.子组件调用父组件,采用props的方式进行调用和赋值,在父组件中设置相关属性值或者方法,子组件通过props的方式进行属性赋值或者方法调用: 2.父组件调用子组件,采用refs的方式进行调用,需要父组件在调用子组件的时候,添加ref属性,并进行唯一命名,在父组件中即可调用: 子组件调用父组件 创建一个简单组件ButtonComment,调用此组件是需传递参数buttonName,并创建初始化方法getInitialState及点击事件sendSword : var ButtonComment

React 组件间通讯

React 组件间通讯 说 React 组件间通讯之前,我们先来讨论一下 React 组件究竟有多少种层级间的关系.假设我们开发的项目是一个纯 React 的项目,那我们项目应该有如下类似的关系: 父子:Parent 与 Child_1.Child_2.Child_1_1.Child_1_2.Child_2_1 兄弟:Child_1 与 Child_2.Child_1_1 与 Child_2.etc. 针对这些关系,我们将来好好讨论一下这些关系间的通讯方式. (在 React 中,React 组

React组件生命周期小结

转载自:http://www.jianshu.com/p/4784216b8194 下面所写的,只适合前端的React.(React也支持后端渲染,而且和前端有点小区别,不过我没用过.) 相关函数 简单地说,React Component通过其定义的几个函数来控制组件在生命周期的各个阶段的动作. 在ES6中,一个React组件是用一个class来表示的(具体可以参考官方文档),如下: // 定义一个TodoList的React组件,通过继承React.Component来实现 class Tod

结合 ES6+ 开发 React 组件

这是 Steven Luscher 写的一篇关于 React 的文章,Steven Luscher 擅长使用 React 和 GraphQL 构建应用. 原文地址:http://babeljs.io/blog/2015/06/07/react-on-es6-plus/ 当重新设计 Instagram Web 的时候,使用了一些 ES6+ 的特性来编写 React 组件.在这里简要的说一下这些语言新特性对 React 应用的开发有什么影响,这些 ES6+ 特性使得 React 开发更简单更有趣.