前言
在刚开始使用Dva的时候,写好models,通过connect进行仓库与组件的链接的时候怎么不是很理解,翻译官方文档也没有明确的解释。
提示:以下是本篇文章正文内容,下面案例可供参考
一、connect的用来干什么
connect用来链接组件和状态管理器。你可以通过dispath调用对应仓库中的方法,也可以通过在this.props下找到仓库的数据进行操作。
connect 方法返回的也是一个 React 组件,通常称为容器组件。因为它是原始 UI 组件的容器,即在外面包了一层 State。
connect 方法传入的第一个参数是 mapStateToProps 函数,mapStateToProps 函数会返回一个对象,用于建立 State 到 Props 的映射关系。
我们现在来看看connect组件后,this.props中会出现什么。
可以看到this.props中会多一个region这个属性,这个属性也就是你namespace为region的仓库中的所有内容。
- loading:是判断这个数据是否以及加载完成。
- region:是返回过来的数据。
- router:是触发请求的时候,页面的路由
这里是models目录下的Region.js文件
import {getRegionList} from '../../server/server'
export default {
namespace: 'region',
state: {},
effects: {
*getList({payload},{put,call}){
const res = yield call(getRegionList,payload)
if(res.status == 200){
yield put({
type:'add',
payload:res.data.data || {}
})
}
}
},
reducers: {
add(state, action){
return {
...state,
data: action.payload
}
}
}
}
这里是与models在同一文件夹下的index.js目前
import styles from './index.css';
import { connect } from 'dva';
import React from 'react';
import { Cascader } from 'antd';
// [{
// value: 'zhejiang',
// label: 'Zhejiang',
// children: [
// {
// value: 'hangzhou',
// label: 'Hangzhou',
// children: [
// {
// value: 'xihu',
// label: 'West Lake',
// },
// ],
// },
// ],
// },]
class Region extends React.Component {
constructor (props){
super(props)
this.state = {
data : [],
}
}
componentDidMount(){
const { dispatch } = this.props;
dispatch({
type:'region/getList',
payload: {}
}).then((res) => {
this.setState({
data:this.props.region.data
})
})
}
patch = () => {
const { dispatch } = this.props;
dispatch({
type:'region/add',
payload: {}
})
}
onChange = (value) => {
console.log(value);
}
render(){
const options = [this.state.data]
return (
<div className={styles.normal}>
<div onClick={this.patch}>惦记我{}</div>
<Cascader options={options} onChange={this.onChange} defaultValue={['zhejiang', 'hangzhou', 'xihu']} placeholder="Please select" fieldNames={
{ label: 'mc', value: 'id', children: 'children' }} rowkey='id'/>,
</div>
);
}
}
const mapStateToProps = ({region, login, global = {}, loading}) =>{
return {
region,
}
export default connect(mapStateToProps)(Region);
@connect和connect的区别
@connect其实就是connect的语法糖,让我们更方便的把仓库与组件进行映射。唯一需要注意的地方就是@connect必须卸载export 的前面。如下
import { connect } from 'dva';
@connect(({region}) => ({
region
}))
`class Region extends React.Component {
constructor (props){
super(props)
this.state = {
data : [],
}
}
componentDidMount(){
const { dispatch } = this.props;
dispatch({
type:'region/getList',
payload: {}
}).then((res) => {
this.setState({
data:this.props.region.data
})
})
}
patch = () => {
const { dispatch } = this.props;
dispatch({
type:'region/add',
payload: {}
})
}
onChange = (value) => {
console.log(value);
}
render(){
console.log(this.props)
const options = [this.state.data]
return (
<div className={styles.normal}>
<div onClick={this.patch}>惦记我{}</div>
<Cascader options={options} onChange={this.onChange} defaultValue={['zhejiang', 'hangzhou', 'xihu']} placeholder="Please select" fieldNames={
{ label: 'mc', value: 'id', children: 'children' }} rowkey='id'/>,
</div>
);
}
}
export default Region
总结
上述是对Dva中使用connect以及@connect的说明,根据自己喜好选择方式即可。