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

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

时间2025-07-29 17:25:51分类IT科技浏览6274
导读:一、前言 最近在自学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
tennet命令(nntpget命令 – 下载新闻组文章) 如何让网站被百度收录(如何让你的网站快速被百度收录?)