vue 动态组件(component :is) 和 dom元素限制(is)用法说明


Posted in Javascript onSeptember 04, 2020

一、is的使用

参考Vue 2.0教程,有讲到 is 的使用:

解析 DOM 模板时的注意事项

有些 HTML 元素,诸如 <ul>、<ol>、<table> 和 <select>,对于哪些元素可以出现在其内部是有严格限制的。而有些元素,诸如 <li>、<tr> 和 <option>,只能出现在其它某些特定的元素内部。

这会导致我们使用这些有约束条件的元素时遇到一些问题。例如:

<table>
 <blog-post-row></blog-post-row>
</table>

这个自定义组件 <blog-post-row> 会被作为无效的内容提升到外部,并导致最终渲染结果出错。幸好这个特殊的 is 特性给了我们一个变通的办法:

<table>
 <tr is="blog-post-row"></tr>
</table>

可以看出,is提供了一个途径,让我们用自定义组件,替换其他的HTML元素。使用时只需加上属性 is="自定义组件名"。

在这种为了解除dom元素限制,自由渲染自定义组件的场景下,仅需渲染一次,所以is的值写死为自定义组件的名称就可以了。

另外有些交互场景,是需要动态切换视图组件的。

二、动态组件 :is的使用

上面讲了利用is讲元素替换为自定义组件的用法。

若某个数据结构对应的HTML视图要求根据请求数据内容或者用户的选择,来渲染出不同的视图,就需要我们进行动态渲染。

比如:获取了后台的表格数据,可以根据用户的选择切换渲染成表单展示还是列表展示。

vue 动态组件(component :is) 和 dom元素限制(is)用法说明

此时可以将is的值绑定为一个变量,is就变成了v-bind:is="变量名",即 :is="变量名"。当变量名赋值为哪个自定义组件名时,拥有:is=“变量名”属性的元素就会渲染为哪个组件。由于is的值不再是一章节中的静态的值,而是进行了数据绑定,所以绑定的变量要在data中定义过的。

动态组件的使用场景往往比第一章的解除dom元素限制的场景要复杂一点。虽然is属性在常用的HTML元素上都可以使用的,但常见的解除dom元素限制的场景使用元素一般为<li><option>等。vue为动态组件的使用场景提供了<component>元素。

若要在切换中缓存保留动态渲染组件的状态,可以用<keep-alive>元素将动态组件包裹。举个例子:

<!-- 失活的组件将会被缓存!-->
<keep-alive>
 <component v-bind:is="currentTabComponent"></component>
</keep-alive>

补充知识:vue 利用component组件和is属性实现动态组件

我刚学了一种 vue 新的布局方式,通过config配置,利用component组件和is属性来控制页面里面展示内容,在这里简单做一个 dome

1,首先新建一些组件的vue页面

这个文件的目录,其中component中的是页面展示的组件

src
 assets // 静态文件
 component // 组件文件
  BaseInfo.vue
  OpenInfo.vue
  CommentReview.vue
  OrderInfo.vue
 config // 配置文件
  index.js
 view // 页面内容
  index.vue

这里展示一下 组件中的内容

<template>
 // 其他页面也一样,只有背景色与页面的展示名不同,这就不一一介绍了
 <div class="content">我是 OpenInfo 页面</div>
</template>
<script>

export default {
 name:'openInfo'
 data() {
 return {};
 }
};
</script>
<style scoped>
.content {
 display: flex;
 justify-content: space-between;
 width: 1000px; 
 height: 200px;
 background-color: green;
}
</style>

2,config 文件中的配置

const open = function () {
 const vm = this
 return [
  {
  // type:‘' 可以通过type类型来判断展示那些组件内容
  modules: [
   {
   id: 'baseInfo',
   refName: 'baseInfo',
   component: () => import('@/component/open/BaseInfo')
   },
   {
   id: 'lineInfo',
   refName: 'lineInfo',
   component: () => import('@/component/open/OpenInfo')
   },
   {
   id: 'reviewInfo',
   refName: 'reviewInfo',
   component: () => import('@/component/open/CommentReview')
   },
   {
   id: 'orderInfo',
   refName: 'orderInfo',
   component: () => import('@/component/open/OrderInfo')
   }
  ]
  }
 ]
 }
 
 export const openModules = vm => {
 return open.call(vm)
 }

3,展示页面中的操作

<template>
 <div class="content">
 <div>我是 index</div>
 <div v-for="(content,index) in openListValue" :key="index">
 <!-- component标签创建动态组件,is属性指向谁,就显示哪个组件 -->
  <component :key="content.index"
  :is="content.component" 
  :ref="content.refName"
  :refName="content.refName"
  ></component>
 </div>
 </div>
</template>
<script>
import { openModules } from "@/config/index";

export default {
 data() {
 return {
  openList: [],
  openListValue: []
 };
 },
 mounted() {
 this.getList();
 },
 methods: {
 getList() {
  this.openList = openModules(vm)[0];
  this.openListValue = this.openList.modules;
 }
 }
};
</script>
<style scoped>
.content {
 padding-top: 20px;
 display: flex;
 flex-direction: column;
 width: 1000px;
}
</style>

页面展示:

vue 动态组件(component :is) 和 dom元素限制(is)用法说明

注:这里配置可以用多个,给他配置里设置一个 type ,通过 type 类型,来控制展示的是那些界面。这里就不多介绍了

以上这篇vue 动态组件(component :is) 和 dom元素限制(is)用法说明就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
文本链接逐个出现的js脚本
Dec 12 Javascript
javascript 最常用的10个自定义函数[推荐]
Dec 26 Javascript
jquery复选框多选赋值给文本框的方法
Jan 27 Javascript
jQuery读取XML文件内容的方法
Mar 09 Javascript
微信小程序 wx:key详细介绍
Oct 28 Javascript
js实现鼠标左右移动,图片也跟着移动效果
Jan 25 Javascript
如何将 jQuery 从你的 Bootstrap 项目中移除(取而代之使用Vue.js)
Jul 17 jQuery
微信小程序收藏功能的实现代码
Jun 12 Javascript
DatePickerDialog 自定义样式及使用全解
Jul 09 Javascript
使用layui 的layedit定义自己的toolbar方法
Sep 18 Javascript
JS+HTML5本地存储Localstorage实现注册登录及验证功能示例
Feb 10 Javascript
微信小程序使用 vant Dialog组件的正确方式
Feb 21 Javascript
Vue中component标签解决项目组件化操作
Sep 04 #Javascript
JS数组转字符串实现方法解析
Sep 04 #Javascript
v-slot和slot、slot-scope之间相互替换实例
Sep 04 #Javascript
Vue插槽_特殊特性slot,slot-scope与指令v-slot说明
Sep 04 #Javascript
解决vue scoped scss 无效的问题
Sep 04 #Javascript
vue-admin-template配置快捷导航的代码(标签导航栏)
Sep 04 #Javascript
基于vue中的scoped坑点解说
Sep 04 #Javascript
You might like
第十节--抽象方法和抽象类
2006/11/16 PHP
adodb与adodb_lite之比较
2006/12/31 PHP
一贴学会PHP 新手入门教程
2009/08/03 PHP
Yii2中设置与获取别名的函数(setAlias和getAlias)用法分析
2016/07/25 PHP
yii2 上传图片的示例代码
2018/11/02 PHP
浅谈laravel orm 中的一对多关系 hasMany
2019/10/21 PHP
强悍无比的WEB开发好助手FireBug(Firefox Plugin)
2007/01/16 Javascript
基于jQuery中对数组进行操作的方法
2013/04/16 Javascript
js实现交换运动效果的方法
2015/04/10 Javascript
jQuery 利用$.ajax 时获取原生XMLHttpRequest 对象的方法
2016/08/25 Javascript
JQuery Ajax WebService传递参数的简单实例
2016/11/02 Javascript
详解Angular的双向数据绑定(MV-VM)
2016/12/26 Javascript
通过实例了解js函数中参数的传递
2019/06/15 Javascript
关于NodeJS中的循环引用详解
2019/07/23 NodeJs
layui表格 返回的数据状态异常的解决方法
2019/09/10 Javascript
vue v-for出来的列表,点击某个li使得当前被点击的li字体变红操作
2020/07/17 Javascript
springboot+vue实现文件上传下载
2020/11/17 Vue.js
常见python正则用法的简单实例
2016/06/21 Python
Python 数据结构之旋转链表
2017/02/25 Python
python进阶_浅谈面向对象进阶
2017/08/17 Python
Python实现的从右到左字符串替换方法示例
2018/07/06 Python
解决python3输入的坑——input()
2020/12/05 Python
canvas 橡皮筋式线条绘图应用方法
2019/02/13 HTML / CSS
Whittard官方海外旗舰店:英国百年茶叶品牌
2018/02/22 全球购物
捷克原创男装和女装购物网站:Bolf.cz
2018/04/28 全球购物
英国最受欢迎的母婴精品品牌:JoJo Maman BéBé
2021/02/17 全球购物
建龙钢铁面试总结
2014/04/15 面试题
幼儿如何来做好自我评价
2013/11/05 职场文书
计划生育证明格式及范本
2014/10/09 职场文书
开展党的群众路线教育实践活动总结报告
2014/10/31 职场文书
人事行政助理岗位职责
2015/04/11 职场文书
文明旅游倡议书
2015/04/28 职场文书
2016年春季开学典礼新闻稿
2015/11/25 职场文书
2016教师校本研修心得体会
2016/01/08 职场文书
2019各种保证书范文
2019/06/24 职场文书
Node实现搜索框进行模糊查询
2021/06/28 Javascript