一、状态提升

使用 react 经常会遇到几个组件需要共用状态数据的情况。这种情况下,我们最好将这部分共享的状态提升至他们最近的父组件当中进行管理。

原理:父组件基于属性把自己的一个fn函数传递给子组件,子组件在某些操作下把fn执行,在执行fn的过程中把父组件中的一些属性信息进行了修改,从而影响相关子组件的重新渲染。

直接看代码

<Vote title={'标题一'}></Vote>  //调用

vote.js文件
import React from 'react';
import VoteHeader from './voteHeader.js'
import VoteBody from './voteBody.js'
import VoteFooter from './voteFooter.js'
class Vote extends React.Component{
constructor(){
super()
this.state = {
n: 0,
m: 0
}
}
handleNum = (type)=> {
if (type === 1) {
this.setState({
n: this.state.n+1
})
} else {
this.setState({
m: this.state.m+1
})
}
}
render() {
let {title} = this.props;
let {n, m} = this.state;
let {handleNum} = this;
return (
<div>
<VoteHeader title={title}></VoteHeader>
<VoteBody n={n} m={m}></VoteBody>
//将父组件函数传递给子组件调用
<VoteFooter handleNum={handleNum}></VoteFooter>
</div>
)
}
}
export default Vote;

VoteHeader.js文件
import React from 'react';
class VoteHeader extends React.Component{
constructor(){
super()
}
render() {
let {title} = this.props;
return (
<div>{title}</div>
)
}
}
export default VoteHeader;

VoteBody.js文件
import React from 'react';
class VoteBody extends React.Component{
constructor(){
super()
}
render() {
let {n, m} = this.props;
return (
<div>
<div>赞成{n}票</div>
<div>反对{m}票</div>
</div>
)
}
}
export default VoteBody;

VoteFooter.js文件
import React from 'react';
class VoteFooter extends React.Component{
constructor(){
super()
}
render() {
let {handleNum} = this.props;
return (
<div>
//这个地方通过操作父组件函数改变父组件的属性值
<button onClick={e => handleNum(1)}>赞成</button>
<button onClick={e => handleNum(0)}>反对</button>
</div>
)
}
}
export default VoteFooter;

二、context上下文

基于上下文管理组件信息的传递

上下文也是依托组件嵌套关系完成的,它的优势在于:当前组件(祖先组件)设置一些上下文,后代所有组件(儿子或孙子等)都可以随时获取使用,而不需要调取组件的时候层层传递。

直接看代码

<Vote title={'标题一'}></Vote>  //调用

vote.js文件
import React from 'react';
import PropTypes from 'prop-types';
import VoteHeader from './voteHeader1.js'
import VoteBody from './voteBody1.js'
import VoteFooter from './voteFooter1.js'
class Vote extends React.Component{
//设置后代需要使用的上下文及类型
static childContextTypes = {
title: PropTypes.string,
n: PropTypes.number,
m: PropTypes.number,
handleNum: PropTypes.func
}
//获取后代需要的上下文信息(可以把这个方法理解为一个生命周期函数,在每一次render之前执行,return的值就是后期需要用到的上下文具体信息值)
getChildContext(){
let {title} = this.props;
let {n, m} = this.state;
let {handleNum} = this;
return {
title,
n,
m,
handleNum
}
}
constructor(){
super();
this.state = {
n: 0,
m: 0
}
}
handleNum = (type)=> {
if (type === 1) {
this.setState({
n: this.state.n+1
})
} else {
this.setState({
m: this.state.m+1
})
}
}
render() {
return (
<div>
//这里就不需要再手动传递props了
<VoteHeader></VoteHeader>
<VoteBody></VoteBody>
<VoteFooter></VoteFooter>
</div>
)
}
}
export default Vote;

VoteHeader.js文件
import React from 'react';
import PropTypes from "prop-types"
class VoteHeader extends React.Component{
//在后代组件中,我们需要用到哪些上下文信息,一定要指定当前需要使用的信息值类型(而且必须和祖先指定的一样),否者无法基于context获取
static contextTypes = {
title: PropTypes.string
}
constructor(){
super()
}
render() {
return (
//通过上下文的值来进行渲染
<div>{this.context.title}</div>
)
}
}
export default VoteHeader;

VoteBody.js文件
import React from 'react';
import PropTypes from "prop-types"
class VoteBody extends React.Component{
static contextTypes = {
n: PropTypes.number,
m: PropTypes.number
}
constructor(){
super()
}
render() {
let {n, m} = this.context;
return (
<div>
<div>赞成{n}票</div>
<div>反对{m}票</div>
</div>
)
}
}
export default VoteBody;

VoteFooter.js文件
import React from 'react';
import PropTypes from "prop-types";
class VoteFooter extends React.Component{
static contextTypes = {
handleNum: PropTypes.func,
}
constructor(){
super()
}
render() {
let {handleNum} = this.context;
return (
<div>
<button onClick={e => handleNum(1)}>赞成</button>
<button onClick={e => handleNum(0)}>反对</button>
</div>
)
}
}
export default VoteFooter;

react入门(六):状态提升&context上下文小白速懂的更多相关文章

  1. react之传递数据的几种方式props传值、路由传值、状态提升、redux、context

    react之传递数据的几种方式 1.父子传值 父传值:<子的标签 value={'aaa'} index={'bbb'}></子的标签> 子接值:<li key={thi ...

  2. es6 Object.assign ECMAScript 6 笔记(六) ECMAScript 6 笔记(一) react入门——慕课网笔记 jquery中动态新增的元素节点无法触发事件解决办法 响应式图像 弹窗细节 微信浏览器——返回操作 Float 的那些事 Flex布局 HTML5 data-* 自定义属性 参数传递的四种形式

    es6 Object.assign   目录 一.基本用法 二.用途 1. 为对象添加属性 2. 为对象添加方法 3. 克隆对象 4. 合并多个对象 5. 为属性指定默认值 三.浏览器支持 ES6 O ...

  3. React.js 小书 Lesson17 - 前端应用状态管理 —— 状态提升

    作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson17 转载请注明出处,保留原文链接和作者信息. 上一个评论功能的案例中,可能会有些同学会对一个 ...

  4. React Context上下文

    目录 前言 一 context旧版使用步骤 1.1 根组件childContextTypes属性 1.2 根组件getChildContext方法 1.3 子组件contextTypes静态属性 1. ...

  5. React入门看这篇就够了

    摘要: 很多值得了解的细节. 原文:React入门看这篇就够了 作者:Random Fundebug经授权转载,版权归原作者所有. React 背景介绍 React 入门实例教程 React 起源于 ...

  6. [转]React入门看这篇就够了

    摘要: 很多值得了解的细节. 原文:React入门看这篇就够了 作者:Random Fundebug经授权转载,版权归原作者所有. React 背景介绍 React 入门实例教程 React 起源于 ...

  7. React入门教程(二)

    前言 距离上次我写 React 入门教程已经快2个月了,年头年尾总是比较忙哈,在React 入门教程(一)我大概介绍了 React 的使用和一些注意事项,这次让我们来继续学习 React 一. Rea ...

  8. react入门(2)

    接着上一次的讲,如果没有看过上一篇文章的小伙伴可以先看一下http://www.cnblogs.com/sakurayeah/p/5807821.html React事件 可以先看一下官网讲解的内容h ...

  9. react入门(4)

    首先还是来回顾一下前三篇讲的内容 react入门(1): jsx,组件,css写法 react入门(2):事件,this.props.children,props,...other react入门(3 ...

随机推荐

  1. 不需内测账号,带你体验微信小程序完整开发过程

    不需内测账号,带你体验微信小程序完整开发过程 2016年09月24日 - 作者: SwiftCafe 微信小程序还没正式发布就已经迅速成为大家讨论的焦点,那么大家可能觉得只有收到内测邀请才能体验小程序 ...

  2. Python--day70--csrf简单用法、 跨站请求伪造和csrf_token使用

    1,csrf简单用法 2,Django里面的setting加入了防跨站伪造:这段代码帮你生成特殊字符串,帮你塞到html页面中来 3,csrf_token使用:

  3. codedecision P1112 区间连续段 题解 线段树

    题目描述:https://www.cnblogs.com/problems/p/P1112.html 题目链接:http://codedecision.com/problem/1112 线段树区间操作 ...

  4. 洛谷P1280 尼克的任务 题解 动态规划/最短路

    作者:zifeiy 标签:动态规划.最短路 题目链接:https://www.luogu.org/problem/P1280 题目大意: 有k个任务分布在第1至n这n个时间点,第i个任务的于第 \(P ...

  5. H3C NAT组网和常用术语

  6. P1047 汉诺塔

    题目描述 汉诺塔是根据一个印度传说形成的数学问题:有三根杆子A, B, C, A杆上有n个穿孔圆盘, 盘的尺寸由下到上依次变小. 要求按照下列规则将所有圆盘移至C杆: 每次只能移动一个圆盘 大盘不能叠 ...

  7. vue-learning:39 - router - vue-router的基本使用

    vue-router路由的基本使用 一张图阐述vue-router的基本使用步骤 // 0. 如果全局使用CDN引入:vue 引入在前,vue-router引入在后 // <script src ...

  8. CodeForces Goodbye 2017

    传送门 A - New Year and Counting Cards •题意 有n张牌,正面有字母,反面有数字 其中元音字母$a,e,o,i,u$的另一面必须对应$0,2,4,6,8$的偶数 其他字 ...

  9. Struts2和Spring集成

    Spring是一个流行的Web框架,它提供易于集成与很多常见的网络任务.所以,问题是,为什么我们需要Spring,当我们有Struts2?Spring是超过一个MVC框架 - 它提供了许多其它好用的东 ...

  10. mysql主从之基于gtid的主从复制

    一 GITD介绍 1.1 gtid的含义 Global Transaction Identifier,全局事务标识 阿里云的rds目前已经使用gtid 基于gtid的主从复制原理 每个mysql数据库 ...