首页IT科技react的用法和短语(react @connect的作用简单理解(dva @connect))

react的用法和短语(react @connect的作用简单理解(dva @connect))

时间2025-06-18 15:59:53分类IT科技浏览5443
导读:一、前言 最近在自学react,发现项目中用到了@connect这个方法,但是不知道是什么意思;...

一               、前言

最近在自学react               ,发现项目中用到了@connect这个方法                     ,但是不知道是什么意思;

网上百度       ,发现有这样解释的:

connect的作用是将组件和models结合在一起               。将models中的state绑定到组件的props中                     。并提供一些额外的功能               ,譬如dispatch

还有这样解释的:

connect用来链接组件和状态管理器       。你可以通过dispath调用对应仓库中的方法                     ,也可以通过在this.props下找到仓库的数据进行操作               。

还有这样的:

connect 方法返回的也是一个 React 组件       ,通常称为容器组件                     。因为它是原始 UI 组件的容器        ,即在外面包了一层 State       。 connect 方法传入的第一个参数是 mapStateToProps 函数                     ,mapStateToProps 函数会返回一个对象              ,用于建立 State 到 Props 的映射关系        。

这种东西初学者看了也不明白是什么意思        ,感觉不够通俗易懂                     。(反正本人是没看懂)

后来                      ,终于自己琢磨明白了              ,在此总结下              。

二                     、@connect的作用个人理解

1.首先,是react项目里用到了@connect注解                      ,点击这个注解进入源码                     ,发现路径是node_modules\dva\index.d.ts,因此也可以说是dva中的@connect        。

2.本人的项目中               ,是这样使用的:

@connect(({ loading, OnlineTrainSet, codeselect }) => ({ OnlineTrainSet, codeselect, loading: loading.models.OnlineTrainSet, }))

(1)@connect的意思是                     ,将models中的状态(state)装到组件的props里                      。

(2)具体到这里       ,就是会把OnlineTrainSet               ,codeselect                     ,loading装入this.props里面       ,后续使用this.props.OnlineTrainSet        ,this.props.codeselect                     ,this.props.loading就可以使用了              。

(3)OnlineTrainSet              ,是本人的项目中有一个文件项目名\src\pages\MyOnlineTrainSet\models\OnlineTrainSet.js         ,内容有:

export default { namespace: OnlineTrainSet, state: { currView: home, currData: {}, ......

注意                      ,这个文件里namespace: OnlineTrainSet              ,上方@connect里用OnlineTrainSet就可以装入了;

state,就是装入this.props里的内容;

这个文件的位置在models文件夹里                      ,所以能用@connect装入;

使用了@connect后                     ,后续页面就可以使用this.props.OnlineTrainSet.currView       、获取到的值就是home。

(4)codeselect,这个也类似               ,只不过是位于本人的项目中的项目名\src\models\codeselect.js(也是自己写的js                     ,注意位置是另一个models文件夹       ,总之也可以)               ,其中也用到了namespace: codeselect与state                     ,所以也可以用@connect装入                      。

(5)loading       ,这个搜索namespace: loading没有找到        ,应该是框架里实现的                     ,也类似;

这里是把loading.models.OnlineTrainSet装入了this.props里面;

获取时              ,使用this.props.loading        ,取到的值就是loading.models.OnlineTrainSet的值;

loading.models里                      ,有各个文件的加载情况              ,如果正在加载中               、就是true,如果不是                     、就是false;

所以                      ,当this.props.loading为true时                     ,就说明OnlineTrainSet.js文件正在加载中;(当this.props.loading为false时,就说明OnlineTrainSet.js文件加载完了;如果为null               ,就说明没有值       、没有加载这个文件)

3.后续代码中                     ,是这样使用的:

const { OnlineTrainSet } = this.props; //和这个一样 //const OnlineTrainSet = this.props.OnlineTrainSet; console.log(OnlineTrainSet.treeData);

这个的意思是       ,声明一个const类型的OnlineTrainSet对象               ,值为this.props.OnlineTrainSet (ES6语法);

因为之前用@connect放入this.props里面了                     ,所以这里就可以取出来使用                     。

三        、总结

1.react(dva)里的@connect(connect)方法       ,可以把models文件夹里的js文件里的state参数装入this.props里面        ,根据namespace装入

2.后续使用时                     ,可以从this.props里拿出来用

3.可以把自己写的js文件的state参数装入              ,也可以把框架实现的state参数装入        ,供后续使用。(例如上方的loading)

四                     、备注

1.关于额外的功能                      ,譬如dispatch              ,是这样:

(1)上方自己写的OnlineTrainSet.js文件中,在state参数旁边                      ,还有这样的一段: effects: { *fetchTreeNodes({ queryPara, callback }, { call, put }) { const response = yield call(services.post, /api/xxx/treenodes, queryPara); if (response) { yield put({ type: updateTreeData, treeData: response, queryPara, }); if (callback) callback(response); } },

这段是请求后端接口/api/xxx/treenodes                     ,获取到返回值后,使用put({})方法把返回值放入了自己的state里               ,key是treeData                     ,value是response;(还有key是queryPara       ,value是queryPara               ,也放到自己的state里了               。)

由于之前用@connect放入了this.props里                     ,所以后续用this.props.OnlineTrainSet.treeData就可以获取到值                     。

这里的type: updateTreeData       ,是对数据进行了处理        ,下面还有个处理方法:

reducers: { updateTreeData(state, action) { return { ...state, treeData: action.treeData || state.treeData, editVisiable: false, }; }, ......

(2)注意                     ,获取值之前              ,在使用@connect的页面里还用到了这样一段:

this.props.dispatch({ type: OnlineTrainSet/fetchTreeNodes, queryPara: {}, callback: resp => { ...... }, });

这里type: OnlineTrainSet/fetchTreeNodes的意思        ,就是指OnlineTrainSet.js文件里的fetchTreeNodes方法;

callback里可以写方法执行完毕后执行的方法(回调方法);

需要先执行完这个dispatch方法后                      ,使用this.props.OnlineTrainSet.treeData才有值       。

(3)这样              ,就是说使用@connect后就可以用dispatch方法了               。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
数字营销网站编辑tk(SEO与SEM:数字营销的双翼,你了解吗?)