React×Redux——react-redux库connect()方法与Provider组件
在写Redux的时候我们就了解了 概念一旦我们选择使用了这个react-redux库 展示组件展示组件(presentational component)
展示组件其实就是把我们的普通组件的数据与逻辑抽离出来 容器组件容器组件(container component)
容器组件是由我们react-redux库的API通过展示组件生成的 关系从它们的名字也可以猜到,它们是内外关系 说的再通俗一些 下面我们来看一下react-redux库的核心 connect上面也说到了 import {connect} from 'react-redux';
const Container = connect()(Component);
结构就是这个样子 <Container>
<Component/>
</Container>
不过现在我们仅仅是通过展示组件生成了一个容器组件
名字就和reducer一样,只是官方的概念性叫法(不过还是蛮形象的) 所以完整的用法应该是这样的 const Container = connect( mapStateToProps,mapDispatchToProps )(Component);
但是此时mapStateToProps与mapDispatchToProps我们还没有定义 mapStateToPropsmapStateToProps负责将state的数据映射到展示组件的this.props const mapStateToProps = (state) => {
return {
list: state.list
}
}
此时你会发现这个函数名有多合适
但有时,我们不能这么轻松的就通过state的某个属性值获得要传递的数据 const mapStateToProps = (state) => {
return {
list: handler(state.list,state.option);
}
}
比如说这里handler就是我们的处理函数 const handler = (list,option) => {
switch(option){
case "SHOW_ACTION":
return list.filter(...);
case "SHOW_CROSSED":
return list.filter(...);
...
default:
return list;
}
}
这个函数我没有写完整,相信大家应该都能看明白 mapStateToProps会订阅store,state更新后,就会触发展示组件重绘 上面也说道了,除了state我们还可以使用容器组件的属性props const mapStateToProps = (state,ownProps) => {
return {
...
}
}
如果容器组件的props发生改变的话,同样会触发展示组件重绘 mapDispatchToPropsmapDispatchToProps负责定义发送action的函数映射到展示组件的this.props const mapDispatchToProps = (state,ownProps) => {
return {
onClick: () => {
dispatch({
type: 'SET_FILTER',filter: ownProps.filter
})
}
}
}
如果是作为对象的话,就更简单了 const mapDispatchToProps = {
onClick: (filter) => {
type: 'SET_FILTER',filter: filter
}
}
这个对象的值是一个函数,它被认为是一个Action Creator Provider在完成了Container与Componet的连接 好在,react-redux提供了Provider组件让我们省了不少功夫 render(
<Provider store={store}>
<App/>
</Provider>,document.getElementById('root')
);
小实例上一次介绍Redux的时候介绍了一个简单的计数器 import React from 'react';
import {Component} from 'react'
import ReactDom from 'react-dom';
import {createStore,combineReducers} from 'redux';
import {connect,Provider} from 'react-redux';
首先定义单纯用来展示UI的展示组件 class Counter extends Component {
render(){
const {value,reduceHandler,addHandler} = this.props;
return (
<div>
<p>{value}</p>
<button onClick={reduceHandler}>-</button>
<button onClick={addHandler}>+</button>
</div>
)
}
};
然后定义映射函数,生成容器组件 const mapStateToProps = (state) => {
return {
value: state.cnt
}
}
const mapDispatchToProps = (dispatch) => {
return {
reduceHandler: () => {
dispatch({type: 'REDUCE'});
},addHandler: () => {
dispatch({type: 'ADD'});
}
}
}
const APP = connect(mapStateToProps,mapDispatchToProps)(Counter);
Reducer稍微改变一下 const reducer = (state = {cnt: 0},action) => {
switch (action.type) {
case 'ADD':
return {cnt: state.cnt + 1};
case 'REDUCE':
return {cnt: state.cnt - 1};
default:
return state;
}
};
const store = createStore(reducer);
渲染函数中的结构外部嵌套Provider并添加store const render = () => {
ReactDom.render(
<Provider store={store}>
<APP/>
</Provider>,document.getElementById('root')
);
};
render();
有了Provider,我们也就不需要 ==主页传送门== (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |