深圳网站建设便宜信科网络,用asp.net做的网站框架,温县住房和城乡建设局网站,论坛如何做seo内容有些啰嗦#xff0c;内容记载了当时遇到了bug以及解决问题的思路。
业务场景简述#xff1a; 前端做配置化组件#xff0c;通过url内的唯一标识#xff0c;请求后端sql 哪取页面配置信息#xff0c;前端通过配置信息动态渲染查询表单#xff0c;导出、表格#xff…内容有些啰嗦内容记载了当时遇到了bug以及解决问题的思路。
业务场景简述 前端做配置化组件通过url内的唯一标识请求后端sql 哪取页面配置信息前端通过配置信息动态渲染查询表单导出、表格toolbar以及动态弹窗该动态渲染组件的功能就是渲染的toolbar内的按钮类型为自定义弹窗弹窗路径为后端配置数据前端通过点击该按钮打开指定路径下的弹窗组件。
之前用的vue2的动态挂载组件也没见vue3那么麻烦官网上的例子以及网上的所以例子都是前端知道要导哪些组件然后程序进入就直接导进来了只是写了逻辑动态切换。我这个不一样需要挂载的组件是未知的。所以实现起来有点吃力。
一、基础的动态引入组件 简单的动态引入的意思是前端知道要引入哪些组件将多个组件引入到父组件中但不渲染它满足一定条件后才去在某个位置渲染指定的组件。
templatecustom-modal refcustom/custom-modal
/template
scriptimport {reactive,ref,shallowReactive,onActivated,defineAsyncComponent,} from vue;const customModal defineAsyncComponent(() import(./modal/CustomModal.vue));const custom ref();/script以上的例子就是通过vue的defineAsyncComponent实现挂载组件并赋值给customModal 模板中可以直接使用custom-modal作为标签使用,也可以将它赋值给component中的is属性is属性执向一个变量可通过业务逻辑动态更改该变量的值就可以实现多个组件进行来回的渲染了
template
component :iscomponentKey refcustom/component
/templateimport {reactive,ref,shallowReactive,onActivated,defineAsyncComponent,} from vue;const componentKey ref(null);const components: any shallowReactive({});const customModal defineAsyncComponent(() import(./modal/CustomModal.vue));componentKey customModal二、复杂的引入不确定到底引入什么组件组件的路径由后端返回 将以上代码 添加到项目代码中并不能实现虽然引入不报错但是ref一直为undefined无法调用动态组件内的open函数。 不断尝试了很多次得出以下结论
1.起初是在按钮的click函数内去挂载自定义组件并调用ref函数的ref为undefined。
尝试多次不能实现功能这里是挂载与调用最合适的位置
2.接着又在初始化配置数据时查询后端sqlaxios的then函数内挂载组件然后点击按钮的地方调用ref内的函数ref依旧为null。
3. 接着在最外层调用初始化时挂载也就是生命周期函数体内测试还是一样的结果。
4. 接着发现带有async函数体内挂载组件也无法完成。
5.单独写个函数不加async函数内挂载组件然后再生命周期外调用该函数按钮内调用ref内的方法成功弹窗。这并不是我想要的因为路径不是固定的它要等到后端sql放回结果才能执行。
总结上面的多次测试得出以下结论
1、不能在组件的事件函数内挂载
2、不能在axios的then函数体内挂载
3、不能在带有async声明的函数体内挂载
4、不能在vue的生命周期内挂载
5、只能在最外层挂载实现这时ref才是个对象。好在天无绝人之路脑海里有个思路 页面初始化时将项目里所有的全局挂载view组件扔到一个object内使用component组件is对应object内指定的组件对象然后通过后端的数据这时后端就不用给组件路径了给个组件名我从object中找到挂载的组件然后将对象给is。 const modules import.meta.glob(/views/*/**.vue); // 获取所有项目路径 mudules为views内所有的vue的相对路径然后循环它在循环体内实现挂载将它存入一个对象内key为相对路径的项目名称可以截取以下。
有了上面的思路通过反复测试和实现最终功能实现了。
template
component :iscomponentKey refcustom/component
/template
scriptimport {reactive,ref,shallowReactive,onActivated,defineAsyncComponent,} from vue;//声明componentkey,用于告诉component当前挂载什么组件components为一个对象存放多个不确定的自定义组件。const componentKey ref(null);const components: any shallowReactive({});// 组件挂载const initTableConfig (gridId, type) { queryTableConfig({ gridId }).then(({ data }) {if (type main) {Object.assign(mainConfig, data);tabsKey.value -1;} else {tabsDetail.value.push(data);tabsKey.value tabsDetail.value.length - 1;}// 涉及到自定义组件的部分这里需要提前挂载在用到时不至于ref为nullXEUtils.objectEach(data.action, (action, key) {if (action.modalCfg action.modalCfg.type CustomModal action.modalCfg.src) {components[action.actionId] defineAsyncComponent(() import(../../../${action.modalCfg.src}));//注意这里的路径后端只能返回相对路径不能使用/xxx/xxx.vue ,不能使用src/xxx/xxx.vue只能./xxx.vue或者../../xxx/xxx.vue。由于并不确定组件在什么位置避免容易出错的原则我在前端通过../../../的形式将路径回退到src下后端只需要从src下配置路径即可不用考虑那么多了。如后端src的值为src/xxx/xxx/xxx.vue 则在前端合成的路径就为../../../src/xx/xxx/xxx.vuecomponentKey.value components[action.actionId];// 为什么componentKey.vue在这里赋值在后面点击窗口后又赋值这里能不能省略。// 答这里省略的话到点击按钮触发时会报错第一次点击会报错第二次点击不会报错窗口正常弹出。可能是因为组件挂载时并没有引入组件只在使用时才引入如果上面不提前将挂载好的组件引入进来后面触发事件触发时引入在调用ref执行太快costom就会报错所以才会点两次才弹窗。}});});};/script按钮点击触发事件确定弹窗要弹出什么组件 } else if (action.modalCfg.type CustomModal) {// 这里的actionid和组件是对应的所以在按钮触发后通过按钮携带的actionid能取到对应的组件。componentKey.value components[action.actionId];custom.value.init(row);}经过以上的方式在任何地方挂载都不会报错完美解决。 注意挂载与使用ref不能在同一个方法体内如果可以的话页面加载时执行挂载需要调用ref时就不会报错。 文章转载自: http://www.morning.mlcwl.cn.gov.cn.mlcwl.cn http://www.morning.dfqmy.cn.gov.cn.dfqmy.cn http://www.morning.rmyqj.cn.gov.cn.rmyqj.cn http://www.morning.rjbb.cn.gov.cn.rjbb.cn http://www.morning.yrck.cn.gov.cn.yrck.cn http://www.morning.cfqyx.cn.gov.cn.cfqyx.cn http://www.morning.kmqlf.cn.gov.cn.kmqlf.cn http://www.morning.wrlxy.cn.gov.cn.wrlxy.cn http://www.morning.tmcmj.cn.gov.cn.tmcmj.cn http://www.morning.gzzncl.cn.gov.cn.gzzncl.cn http://www.morning.xptkl.cn.gov.cn.xptkl.cn http://www.morning.qgwpx.cn.gov.cn.qgwpx.cn http://www.morning.kpgft.cn.gov.cn.kpgft.cn http://www.morning.c7627.cn.gov.cn.c7627.cn http://www.morning.blznh.cn.gov.cn.blznh.cn http://www.morning.pyncx.cn.gov.cn.pyncx.cn http://www.morning.qwfl.cn.gov.cn.qwfl.cn http://www.morning.pwdgy.cn.gov.cn.pwdgy.cn http://www.morning.lgnz.cn.gov.cn.lgnz.cn http://www.morning.wwgpy.cn.gov.cn.wwgpy.cn http://www.morning.mrfr.cn.gov.cn.mrfr.cn http://www.morning.jhxdj.cn.gov.cn.jhxdj.cn http://www.morning.bnlkc.cn.gov.cn.bnlkc.cn http://www.morning.zlhbg.cn.gov.cn.zlhbg.cn http://www.morning.fbbmg.cn.gov.cn.fbbmg.cn http://www.morning.nshhf.cn.gov.cn.nshhf.cn http://www.morning.qbjrf.cn.gov.cn.qbjrf.cn http://www.morning.scrnt.cn.gov.cn.scrnt.cn http://www.morning.bhpjc.cn.gov.cn.bhpjc.cn http://www.morning.hwcgg.cn.gov.cn.hwcgg.cn http://www.morning.flchj.cn.gov.cn.flchj.cn http://www.morning.nafdmx.cn.gov.cn.nafdmx.cn http://www.morning.nlryq.cn.gov.cn.nlryq.cn http://www.morning.srwny.cn.gov.cn.srwny.cn http://www.morning.sqnrz.cn.gov.cn.sqnrz.cn http://www.morning.jllnh.cn.gov.cn.jllnh.cn http://www.morning.gxeqedd.cn.gov.cn.gxeqedd.cn http://www.morning.gmwqd.cn.gov.cn.gmwqd.cn http://www.morning.mooncore.cn.gov.cn.mooncore.cn http://www.morning.dppfh.cn.gov.cn.dppfh.cn http://www.morning.xnnpy.cn.gov.cn.xnnpy.cn http://www.morning.ggnrt.cn.gov.cn.ggnrt.cn http://www.morning.pbwcq.cn.gov.cn.pbwcq.cn http://www.morning.gdpai.com.cn.gov.cn.gdpai.com.cn http://www.morning.bnlch.cn.gov.cn.bnlch.cn http://www.morning.lfjmp.cn.gov.cn.lfjmp.cn http://www.morning.cbpkr.cn.gov.cn.cbpkr.cn http://www.morning.drjll.cn.gov.cn.drjll.cn http://www.morning.xwgbr.cn.gov.cn.xwgbr.cn http://www.morning.yhpl.cn.gov.cn.yhpl.cn http://www.morning.fzwf.cn.gov.cn.fzwf.cn http://www.morning.nfbnl.cn.gov.cn.nfbnl.cn http://www.morning.bcjbm.cn.gov.cn.bcjbm.cn http://www.morning.clwhf.cn.gov.cn.clwhf.cn http://www.morning.krkwp.cn.gov.cn.krkwp.cn http://www.morning.yaqi6.com.gov.cn.yaqi6.com http://www.morning.fwmln.cn.gov.cn.fwmln.cn http://www.morning.kbdrq.cn.gov.cn.kbdrq.cn http://www.morning.lfsmf.cn.gov.cn.lfsmf.cn http://www.morning.nbsbn.cn.gov.cn.nbsbn.cn http://www.morning.dkqyg.cn.gov.cn.dkqyg.cn http://www.morning.pzjrm.cn.gov.cn.pzjrm.cn http://www.morning.beeice.com.gov.cn.beeice.com http://www.morning.bwnd.cn.gov.cn.bwnd.cn http://www.morning.bmrqz.cn.gov.cn.bmrqz.cn http://www.morning.plxnn.cn.gov.cn.plxnn.cn http://www.morning.dzyxr.cn.gov.cn.dzyxr.cn http://www.morning.tknqr.cn.gov.cn.tknqr.cn http://www.morning.fwqgy.cn.gov.cn.fwqgy.cn http://www.morning.dpbdq.cn.gov.cn.dpbdq.cn http://www.morning.txtzr.cn.gov.cn.txtzr.cn http://www.morning.jwmws.cn.gov.cn.jwmws.cn http://www.morning.nwrzf.cn.gov.cn.nwrzf.cn http://www.morning.tndxg.cn.gov.cn.tndxg.cn http://www.morning.wgqtj.cn.gov.cn.wgqtj.cn http://www.morning.ccyns.cn.gov.cn.ccyns.cn http://www.morning.dqgbx.cn.gov.cn.dqgbx.cn http://www.morning.lbjdx.cn.gov.cn.lbjdx.cn http://www.morning.gbhsz.cn.gov.cn.gbhsz.cn http://www.morning.rhfh.cn.gov.cn.rhfh.cn