Provider功能主要为以下两点:

  • 在原应用组件上包裹一层,使原来整个应用成为Provider的子组件
  • 接收Redux的store作为props,通过context对象传递给子孙组件上的connect

首先,对原组件进行了封装: render方法中, 渲染了其子级元素, 使整个应用成为Provider的子组件。

(1)this.props children用于获取当前组件的所有子组件

(2)Children为react内部定义的顶级对象, 该对象封装了一些方便操作字组件的方法. Children.only用于获取仅有的一个子组件,没有或者超过一个均会报错. 所以注意: 确保Provider组件的直接子级为单个封闭元素,切勿多个组件平行放置

其次,传递store
(1)constructor方法: Provider初始化时, 获取到props中的store对象;
(2) getChildContext方法: 将外部的store对象放入context对象中,使子孙组件上的connect可以直接访问到context对象中的store。
注: context可以使子孙组件直接获取父级组件中的数据或方法,而无需一层一层通过props向下传递。context对象相当于一个独立的空间,父组件通过getChildContext()向该空间内写值;定义了contextTypes验证的子孙组件可以通过this.context.xxx,从context对象中读取xxx字段的值。

推荐两个博客:

https://segmentfault.com/a/1190000010158572

https://www.jianshu.com/p/815ec73b1354

知识不够,案例来撑:留个github小案例前往

例如react项目的index.js文件

import React from 'react';//引入react库
import ReactDOM from 'react-dom';//引入react-dom插件
import './index.css';
import App from './App';
import registerServiceWorker from './registerServiceWorker';
import {Provider} from 'react-redux' //连接react和redux引入Provider
import store from './store'
ReactDOM.render(
(
<Provider store={store}>//用<Provider>包裹App组件,并且传递一个store
<App/>
</Provider>
),
document.getElementById('root')
);
registerServiceWorker();

App.js

import React from 'react';
import './App.css';
import { connect } from 'react-redux'//react关联redux的插件
import { inputChangeAction, addAction, deleteAction } from './store/actionCreator'
// 无状态组件。
// 无状态组件在组件的实现中,只有render函数时,建议使用。
// 提升性能。
const App = (props)=>{
let {value, data} = props;
return (
<div className="App">
<div className="handle">
<p>{value}</p>
<input type="text" value={value} onChange={props.handleInputChange}/>
<button onClick={props.handleAddAction}>新增</button>
</div>
<ul className="list">
{
data.map((item, index)=>{
return (
<li key={item.id}>
{item.val}
<span onClick={props.handleDeleteAction(index)}>X</span>
</li>
)
})
}
</ul>
</div>
);
}
//将store中的state值转为组件的props使用
const mapStateToProps = (state)=>{
return {
//key为组件的props的名字
// value值,为state中的值
value: state.list.value,
data: state.list.data
}
}
//将store中的dispatch转为组件的props使用
const mapDispatchToProps = (dispatch)=>{
return {
//key为组件的props的名字
// value值为事件,内部可以操作dispatch
handleInputChange(ev){
// console.log('触发了');
let action = inputChangeAction(ev.target.value);
dispatch(action);
},
handleAddAction(){
let action = addAction();
dispatch(action);
},
handleDeleteAction(index){
return function(){
let action = deleteAction(index);
dispatch(action);
}}}
}
export default connect(mapStateToProps, mapDispatchToProps)(App);

store文件的index.js

import { createStore, combineReducers } from 'redux'//引入App.js 输出的函数
import listReducer from './listReducer' //引入默认的state
const reuder = combineReducers({
list: listReducer
})
const store = createStore(reuder);
export default store;

react的redux无状态组件的更多相关文章

  1. react 中的无状态函数式组件

    无状态函数式组件,顾名思义,无状态,也就是你无法使用State,也无法使用组件的生命周期方法,这就决定了函数组件都是展示性组件,接收Props,渲染DOM,而不关注其他逻辑. 其实无状态函数式组件也是 ...

  2. 37行代码构建无状态组件通信工具-让恼人的Vuex和Redux滚蛋吧!

    状态管理的现状 很多前端开发者认为,Vuex和Redux是用来解决组件间状态通信问题的,所以大部分人仅仅是用于达到状态共享的目的.但是通常Redux是用于解决工程性问题的,用于分离业务与视图,让结构更 ...

  3. React系列文章:无状态组件生成真实DOM结点

    在上一篇文章中,我们总结并模拟了JSX生成真实DOM结点的过程,今天接着来介绍一下无状态组件的生成过程. 先以下面一段简单的代码举例: const Greeting = function ({name ...

  4. React 中的 Component、PureComponent、无状态组件 之间的比较

    React 中的 Component.PureComponent.无状态组件之间的比较 table th:first-of-type { width: 150px; } 组件类型 说明 React.c ...

  5. React中的高阶组件,无状态组件,PureComponent

    1. 高阶组件 React中的高阶组件是一个函数,不是一个组件. 函数的入参有一个React组件和一些参数,返回值是一个包装后的React组件.相当于将输入的React组件进行了一些增强.React的 ...

  6. React: 无状态组件生成真实DOM结点

    在上一篇文章中,我们总结并模拟了 JSX 生成真实 DOM 结点的过程,今天接着来介绍一下无状态组件的生成过程. 先以下面一段简单的代码举例: const Greeting = function ({ ...

  7. 15. react UI组件和容器组件的拆分 及 无状态组件

    1.组件的拆分 组件拆分的前提 当所有的逻辑都出现在一个组件内时 组件会变得非常复杂 不便与代码的维护 所以对组件进行拆分 IU组件 进行页面渲染 容器组件  进行逻辑操作 UI组件的拆分 新建一个 ...

  8. Flutter入门之无状态组件

    Flutter核心理念 flutter组件采用函数式响应框架构建,它的灵感来自于React.它设计的核心思想是组件外构建UI,简单解释一下就是组件鉴于它当前的配置和状态来描述它的视图应该是怎样的,当组 ...

  9. Blazor中的无状态组件

    声明:本文将RenderFragment称之为组件DOM树或者是组件DOM节点,将*.razor称之为组件. 1. 什么是无状态组件 如果了解React,那就应该清楚,React中存在着一种组件,它只 ...

随机推荐

  1. ELK系列(2) - Kibana怎么修改日期格式Date format

    问题 Kibana在创建Index Patterns的时候,可以选择某个date类型的field作为排序字段.之后在Discover里打开对应的index,会发现这个date类型的field的格式显示 ...

  2. git教程3-分支

    https://git-scm.com/book/zh/v1/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%9A%84%E7%AE%A1%E7%90%86 ...

  3. 成功安装tesserocr

    首先按照官网的操作,出现了下面的错误. 错误描述: x86_64-linux-gnu-gcc: error trying to exec 'cc1plus': execvp: 没有那个文件或目录 er ...

  4. C - Watchmen

    题目链接:https://vjudge.net/contest/237394#problem/C Watchmen are in a danger and Doctor Manhattan toget ...

  5. HDU 5917 Instability ramsey定理

    http://acm.hdu.edu.cn/showproblem.php?pid=5917 即世界上任意6个人中,总有3个人相互认识,或互相皆不认识. 所以子集 >= 6的一定是合法的. 然后 ...

  6. (转)Linux系统基础网络配置老鸟精华篇

    Linux系统基础网络配置老鸟精华篇 原文:http://blog.51cto.com/oldboy/784625 对于linux高手看似简单的网络配置问题,也许要说出所以然来也并不轻松,因此仍然有太 ...

  7. mysql数据库忘记密码时如何修改(二)

    第一步:找到mysql数据库的my.ini配置文件,在[mysqld]下面添加一行代码:skip-grant-tables 第二步:运行services.msc进入服务管理界面,重启mysql服务. ...

  8. WPF Virtualization

    WPF虚拟化技术分为UI 虚拟化和数据虚拟化 第一种方法被称为"UI 虚拟化".支持虚拟化用户界面的控件是足够聪明来创建只显示的是实际在屏幕上可见的数据项目所需的 UI 元素.例如 ...

  9. linux服务器安装nodejs运行环境

    安装nodejs运行环境 第一步:到node官网下载相应版本的安装包,将安装包放置服务器上,路径为 usr/local/node(可根据自身情况进行修改) 第二步:解压 ***.tar.xz格式文件需 ...

  10. form表单上传域(type="file")的使用----上传文件

    一,单个文件的上传 1.html/jsp页面 <%@ page language="java" contentType="text/html; charset=UT ...