react-redux
1,在 react 中单纯的使用 redux,react 和 redux 代码耦合度太高,经常需要用到 store 对象,为降低 react 和 redux 的耦合度,可以使用 react-redux 这种 react 插件,
2,下载 : npm install -- save react-redux
3,入口文件中,使用 react-redux 中的Provider 组件,包装 组件,此时不需要订阅监听来重绘了,

4,react 中使用到 store的组件中,需要将该组件对象 通过 react-redux 中的 connect 方法进行包装,将 react 和 redux 联系起来,
app.jsx
import React, { Component } from 'react'
import PropTypes from 'prop-types'
import {connect} from 'react-redux'
import {add,cut} from '../../redux/actions'
class App extends Component {
static propTypes={
count:PropTypes.number.isRequired,
add:PropTypes.func.isRequired,
cut:PropTypes.func.isRequired
}
add=()=>{
const num=this.select.value*1; //select中选中的值是字符串,所以乘以1变为number类型
//使用react-redux后不再是调用store的方法更新状态
this.props.add(num)
}
cut=()=>{
const num=this.select.value*1
this.props.cut(num)
}
addIfOdd=()=>{
const num=this.select.value*1;
const count=this.props.count
if(count%2===1){ //state状态是奇数
this.props.add(num)
}
}
addAsync=()=>{
const num=this.select.value*1;
setTimeout(() => {
this.props.add(num)
},1000)
}
render() {
const {count}=this.props
return (
<div>
<p>点击了{count}次</p>
<select ref={select=>this.select=select}>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>
<button onClick={this.add}>add +</button>
<button onClick={this.cut}>cut -</button>
<button onClick={this.addIfOdd}>addIfOdd</button>
<button onClick={this.addAsync}>addAsync</button>
</div>
)
}
}
export default connect(
state=>({count:state}),
{add,cut} //解构赋值,相当于add:add,cut:cut,前一个是redux传给app的属性名,后一个是redux中actions模块中定义的action名字
)(App)
在组件对象中,依赖 redux 的部分集中到了 export default connect () ( App) 中,实际渲染的组件是经过 connect 后的和 redux 联系上的 Connect App 组件
另外,react -redux 一般将所有组件分为 UI 组件 和容器组件,使用 react-redux 中的API的一般放在容器组件一类中,不使用的一般放在 UI 组件一类中,容器组件一般放在 containers 文件夹下,UI 组件一般放在 components 文件夹下,
故我们可以将 App 组件类重新命名为 Counter ,放在 components 文件夹中,而将 Connect App 命名为 App 写入 containers 文件夹,
目录结构为:

app.jsx
import React from 'react'
import Counter from '../components/counter/counter'
import { connect } from 'react-redux'
import { add, cut } from '../redux/actions'
export default connect(
state => ({ count: state }),
{ add, cut } //解构赋值,相当于add:add,cut:cut,前一个是redux传给app的属性名,后一个是redux中actions模块中定义的action名字
)(Counter)
counter / counter.jsx
import React, { Component } from 'react'
import PropTypes from 'prop-types'
export default class Counter extends Component {
static propTypes={
count:PropTypes.number.isRequired,
add:PropTypes.func.isRequired,
cut:PropTypes.func.isRequired
}
add=()=>{
const num=this.select.value*1; //select中选中的值是字符串,所以乘以1变为number类型
//使用react-redux后不再是调用store的方法更新状态
this.props.add(num)
}
cut=()=>{
const num=this.select.value*1
this.props.cut(num)
}
addIfOdd=()=>{
const num=this.select.value*1;
const count=this.props.count
if(count%2===1){ //state状态是奇数
this.props.add(num)
}
}
addAsync=()=>{
const num=this.select.value*1;
setTimeout(() => {
this.props.add(num)
},1000)
}
render() {
const {count}=this.props
return (
<div>
<p>点击了{count}次</p>
<select ref={select=>this.select=select}>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>
<button onClick={this.add}>add +</button>
<button onClick={this.cut}>cut -</button>
<button onClick={this.addIfOdd}>addIfOdd</button>
<button onClick={this.addAsync}>addAsync</button>
</div>
)
}
}

浙公网安备 33010602011771号