Vue에서 동적 구성요소를 사용하는 방법에 대한 간략한 설명이 필요하십니까?

青灯夜游
풀어 주다: 2021-11-10 19:08:41
앞으로
2209명이 탐색했습니다.

本文文章我们来了解一下Vue中的组件,介绍一下动态组件的用法,希望对大家有所帮助!

Vue에서 동적 구성요소를 사용하는 방법에 대한 간략한 설명이 필요하십니까?

动态组件在开发的过程中大多数情况下都会用到,当我们需要在不同的组件之间进行状态切换时,动态组件可以很好的满足我们的需求,其中的核心是component标签和is属性的使用。【相关推荐:《vue.js教程》】

<div id="app">
  <button @click="changeTabs(&#39;child1&#39;)">child1</button>
  <button @click="changeTabs(&#39;child2&#39;)">child2</button>
  <button @click="changeTabs(&#39;child3&#39;)">child3</button>
  <component :is="chooseTabs">
  </component>
</div>
로그인 후 복사
// js
var child1 = {
  template: &#39;<div>content1</div>&#39;,
}
var child2 = {
  template: &#39;<div>content2</div>&#39;
}
var child3 = {
  template: &#39;<div>content3</div>&#39;
}
var vm = new Vue({
  el: &#39;#app&#39;,
  components: {
    child1,
    child2,
    child3
  },
  methods: {
    changeTabs(tab) {
      this.chooseTabs = tab;
    }
  }
})
로그인 후 복사

例子是一个动态组件的基本使用场景,当点击按钮时,视图根据this.chooseTabs值在组件child1,child2,child3间切换。

AST解析

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

//  针对动态组件的解析
function processComponent (el) {
  var binding;
  // 拿到is属性所对应的值
  if ((binding = getBindingAttr(el, &#39;is&#39;))) {
    // ast树上多了component的属性
    el.component = binding;
  }
  if (getAndRemoveAttr(el, &#39;inline-template&#39;) != 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) : &#39;_c("div")&#39;;
  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) : &#39;&#39;) + ")")
  }
로그인 후 복사

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

"with(this){return _c(&#39;div&#39;,{attrs:{"id":"app"}},[_c(&#39;child1&#39;,[_v(_s(test))])],1)}"
로그인 후 복사

动态组件的render函数

with(this){return _c(&#39;div&#39;,{attrs:{"id":"app"}},[_c(chooseTabs,{tag:"component"})],1)}
로그인 후 복사

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

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

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

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

有了render函数,接下来从vnode到真实节点的过程和普通组件在流程和思路上基本一致,这一阶段可以回顾之前介绍组件流程的分析

更多编程相关知识,请访问:编程入门!!

위 내용은 Vue에서 동적 구성요소를 사용하는 방법에 대한 간략한 설명이 필요하십니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:juejin.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿