文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Vue中动态组件怎么用

2023-06-21 21:40

关注

这篇文章将为大家详细讲解有关Vue中动态组件怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

动态组件我相信大部分在开发的过程中都会用到,当我们需要在不同的组件之间进行状态切换时,动态组件可以很好的满足我们的需求,其中的核心是component标签和is属性的使用。

基础描述

// vue<div id="app">  <button @click="changeTabs('child1')">child1</button>  <button @click="changeTabs('child2')">child2</button>  <button @click="changeTabs('child3')">child3</button>  <component :is="chooseTabs">  </component></div>
// jsvar child1 = {  template: '<div>content1</div>',}var child2 = {  template: '<div>content2</div>'}var child3 = {  template: '<div>content3</div>'}var vm = new Vue({  el: '#app',  components: {    child1,    child2,    child3  },  methods: {    changeTabs(tab) {      this.chooseTabs = tab;    }  }})

AST解析

<component>的解读和前面几篇内容一致,会从AST解析阶段说起,过程也不会专注每一个细节,而是把和以往处理方式不同的地方特别说明。针对动态组件解析的差异,集中在processComponent上,由于标签上is属性的存在,它会在最终的ast树上打上component属性的标志。

//  针对动态组件的解析function processComponent (el) {  var binding;  // 拿到is属性所对应的值  if ((binding = getBindingAttr(el, 'is'))) {    // ast树上多了component的属性    el.component = binding;  }  if (getAndRemoveAttr(el, 'inline-template') != null) {    el.inlineTemplate = true;  }}

Vue中动态组件怎么用

render函数

有了ast树,接下来是根据ast树生成可执行的render函数,由于有component属性,render函数的产生过程会走genComponent分支。

// render函数生成函数var code = generate(ast, options);// generate函数的实现function generate (ast,options) {  var state = new CodegenState(options);  var code = ast ? genElement(ast, state) : '_c("div")';  return {    render: ("with(this){return " + code + "}"),    staticRenderFns: state.staticRenderFns  }}function genElement(el, state) {  ···  var code;  // 动态组件分支  if (el.component) {    code = genComponent(el.component, el, state);  }}

针对动态组件的处理逻辑其实很简单,当没有内联模板标志时(后面会讲),拿到后续的子节点进行拼接,和普通组件唯一的区别在于,_c的第一个参数不再是一个指定的字符串,而是一个代表组件的变量。

// 针对动态组件的处理  function genComponent (    componentName,    el,    state  ) {    // 拥有inlineTemplate属性时,children为null    var children = el.inlineTemplate ? null : genChildren(el, state, true);        return ("_c(" + componentName + "," + (genData$2(el, state)) +     (children ? ("," + children) : '') + ")")  }

普通组件和动态组件的对比

普通组件的render函数

"with(this){return _c('div',{attrs:{"id":"app"}},[_c('child1',[_v(_s(test))])],1)}"

动态组件的render函数

"with(this){return _c('div',{attrs:{"id":"app"}},[_c(chooseTabs,{tag:"component"})],1)}"

简单的总结,动态组件和普通组件的区别在于:

  1. ast阶段新增了component属性,这是动态组件的标志

  2. 产生render函数阶段由于component属性的存在,会执行genComponent分支,genComponent会针对动态组件的执行函数进行特殊的处理,和普通组件不同的是,_c的第一个参数不再是不变的字符串,而是指定的组件名变量。

  3. render到vnode阶段和普通组件的流程相同,只是字符串换成了变量,并有{ tag: 'component' }的data属性。例子中chooseTabs此时取的是child1。

工厂函数形式的动态组件

还可以使用如下工厂函数形式的动态组件:

const AsyncComponent = () => ({  // 需要加载的组件 (应该是一个 `Promise` 对象)  component: import('./MyComponent.vue'),  // 异步组件加载时使用的组件  loading: LoadingComponent,  // 加载失败时使用的组件  error: ErrorComponent,  // 展示加载时组件的延时时间。默认值是 200 (毫秒)  delay: 200,  // 如果提供了超时时间且组件加载也超时了,  // 则使用加载失败时使用的组件。默认值是:`Infinity`  timeout: 3000});components: {  AsyncComponent,},

关于“Vue中动态组件怎么用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯