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 相关文章推荐
一些mootools的学习资源
Feb 07 Javascript
为Javascript中的String对象添加去除左右空格的方法(示例代码)
Nov 30 Javascript
javascript基本包装类型介绍
Apr 10 Javascript
Javascript实现的Map集合工具类完整实例
Jul 31 Javascript
判断输入的字符串是否是日期格式的简单方法
Jul 11 Javascript
URL的参数中有加号传值变为空格的问题(URL特殊字符)
Nov 04 Javascript
vue学习教程之带你一步步详细解析vue-cli
Dec 26 Javascript
Vue 组件参数校验与非props特性的方法
Feb 12 Javascript
Vue基础学习之项目整合及优化
Jun 02 Javascript
微信小程序与公众号卡券/会员打通的问题
Jul 25 Javascript
JS实现移动端点击按钮复制文本内容
Jul 28 Javascript
Webpack设置环境变量的一些误区详解
Dec 19 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
PHP操作mysql函数详解,mysql和php交互函数
2011/05/19 PHP
PHP基于imap获取邮件实例
2014/11/11 PHP
PHP Yaf框架的简单安装使用教程(推荐)
2016/06/08 PHP
使用php自动备份数据库表的实现方法
2017/07/28 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
2017/11/10 PHP
php自动加载代码实例详解
2021/02/26 PHP
JavaScript 原型继承之构造函数继承
2011/08/26 Javascript
JS/FLASH实现复制代码到剪贴板(兼容所有浏览器)
2013/05/27 Javascript
jquery获取对象的方法足以应付常见的各种类型的对象
2014/05/14 Javascript
Ext GridPanel加载完数据后进行操作示例代码
2014/06/17 Javascript
IE8 内存泄露(内存一直增长 )的原因及解决办法
2016/04/06 Javascript
JS插件plupload.js实现多图上传并显示进度条
2016/11/29 Javascript
jquery将标签元素的高设为屏幕的百分比
2017/04/19 jQuery
微信小程序实现工作时间段选择
2019/02/15 Javascript
vue监听用户输入和点击功能
2019/09/27 Javascript
微信小程序 scroll-view 水平滚动实现过程解析
2019/10/12 Javascript
nodejs nedb 封装库与使用方法示例
2020/02/06 NodeJs
[01:06:18]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第二场 1月26日
2021/03/11 DOTA
如何在Python函数执行前后增加额外的行为
2016/10/20 Python
Python之日期与时间处理模块(date和datetime)
2017/02/16 Python
Scrapy爬虫实例讲解_校花网
2017/10/23 Python
python实现闹钟定时播放音乐功能
2018/01/25 Python
python内存动态分配过程详解
2019/07/15 Python
react+django清除浏览器缓存的几种方法小结
2019/07/17 Python
Python调用shell命令常用方法(4种)
2020/05/11 Python
Django xadmin安装及使用详解
2020/10/26 Python
便携式太阳能系统的创新者:GOAL ZERO
2018/02/04 全球购物
业务代表的岗位职责
2013/11/16 职场文书
仓库班组长岗位职责
2013/12/12 职场文书
优秀民警事迹材料
2014/01/29 职场文书
高中生操行评语
2014/04/25 职场文书
2014年四风问题个人对照自查剖析材料
2014/09/15 职场文书
部门群众路线教育实践活动对照检查材料思想汇报
2014/10/07 职场文书
python源码剖析之PyObject详解
2021/05/18 Python
正则表达式拆分url实例代码
2022/02/24 Java/Android
Flutter集成高德地图并添加自定义Maker的实践
2022/04/07 Java/Android