vue 组件高级用法实例详解


Posted in Javascript onApril 11, 2018

一、递归组件

组件在它的模板内可以递归地调用自己, 只要给组件设置name 的选项就可以了。

示例如下:

<div id="app19">
   <my-component19 :count="1"></my-component19>
  </div>
Vue.component('my-component19',{
 name: 'my-component19', //其实当你利用 Vue.component 全局注册了一个组件,全局的ID会被自动设置为组件的name。
 props: {
  count: {
   type: Number,
   default: 1
  }
 },
 template: '<div><my-component19 :count="count+1" v-if="count<3"></my-component19></div>'
});
var app19 = new Vue({
 el: '#app19'
});

渲染结果为:

<div id="app19">
  <div>
   <div>
    <div><!----></div>
   </div>
  </div>
 </div>

 设置name 后,在组件模板内就可以递归使用了,不过需要注意的是,必须给一个条件来限制递归数量,否则会抛出错误: max stack size exceeded 。

组件递归使用可以用来开发一些具有未知层级关系的独立组件,比如级联选择器和树形控件等。

二、内联模板

组件的模板一般都是在template 选项内定义的, Vue 提供了一个内联模板的功能,在使用组件时,给组件标签使用inline-template 特性,组件就会把它的内容当作模板,而不是把它当内容分发,这让模板更灵活。

示例如下:     

<div id="app20">
   <my-component20 inline-template>
    <div>
     <h3>在父组件中定义子组件的模板</h3>
     <p>{{msg}}</p>
    </div>
   </my-component20>
  </div>
Vue.component('my-component20',{
 data: function(){
  return {
   msg: '在子组件声明的数据'
  }
 }
});
var app20 = new Vue({
 el: '#app20'
});

三、动态组件

Vue.js 提供了一个特殊的元素<component> 用来动态地挂载不同的组件, 使用is特性来选择要挂载的组件。

示例如下:     

<div id="app21">
   <component :is="currentView"></component>
   <button @click="changeView('A')">切换到A</button>
   <button @click="changeView('B')">切换到B</button>
   <button @click="changeView('C')">切换到C</button>
  </div>
var app21 = new Vue({
 el: '#app21',
 data: {
  currentView: 'comA'
 },
 methods: {
  changeView: function(data){
   this.currentView = 'com'+ data//动态地改变currentView的值就可以动态挂载组件了。
  }
 },
 components: {
  comA: {
   template: '<div>组件A</div>'
  },
  comB: {
   template: '<div>组件B</div>'
  },
  comC: {
   template: '<div>组件C</div>'
  }
 }
});

 四、异步组件

当你的工程足够大, 使用的组件足够多时, 是时候考虑下性能问题了, 因为一开始把所有的组件都加载是没必要的一笔开销。

好在Vue.js 允许将组件定义为一个工厂函数,动态地解析组件。Vue. 只在组件需要渲染时触发工厂函数, 并且把结果缓存起来,用于后面的再次渲染。   

<div id="app22">
      <my-component22></my-component22>
    </div>
Vue.component('my-component22',function(resolve, reject){
  window.setTimeout(function(){
    resolve({
      template: '<div>我是异步渲染的</div>'
    })
  },2000)
});

var app22 = new Vue({
  el: '#app22'
});

工厂函数接收一个resolve 回调,在收到从服务器下载的组件定义时调用。也可以调用reject( reason )指示加载失败。
这里setTimeout 只是为了演示异步,具体的下载逻辑可以自己决定,比如把组件配置写成一个对象配置,通过Ajax 来请求,然后调用resolve 传入配置选项。

总结

以上所述是小编给大家介绍的vue 组件高级用法实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jQuery用unbind方法去掉hover事件及其他方法介绍
Mar 18 Javascript
jquery序列化表单去除指定元素示例代码
Apr 10 Javascript
javascript基本类型详解
Nov 28 Javascript
JavaScript获取表单内所有元素值的方法
Apr 02 Javascript
JavaScript实现页面5秒后自动跳转的方法
Apr 16 Javascript
Javascript之面向对象--接口
Dec 02 Javascript
jQuery实现一个简单的轮播图
Feb 19 Javascript
基于JQuery和原生JavaScript实现网页定位导航特效
Apr 03 jQuery
select获取下拉框的值 下拉框默认选中方法
Feb 28 Javascript
jQuery选择器之基本选择器用法实例分析
Feb 19 jQuery
Element-ui el-tree新增和删除节点后如何刷新tree的实例
Aug 31 Javascript
vue使用canvas实现移动端手写签名
Sep 22 Javascript
vue单个组件实现无限层级多选菜单功能
Apr 10 #Javascript
React如何避免重渲染
Apr 10 #Javascript
vue select组件的使用与禁用实现代码
Apr 10 #Javascript
vue 自定义 select内置组件
Apr 10 #Javascript
JavaScript如何对图片进行黑白化
Apr 10 #Javascript
axios 处理 302 状态码的解决方法
Apr 10 #Javascript
vue.js中npm安装教程图解
Apr 10 #Javascript
You might like
PHP 超链接 抓取实现代码
2009/06/29 PHP
win7下memCache的安装过程(具体操作步骤)
2013/06/28 PHP
13个绚丽的Jquery 界面设计网站推荐
2010/09/28 Javascript
理解Angular数据双向绑定
2016/01/10 Javascript
JQuery实现简单的服务器轮询效果实例
2016/03/31 Javascript
几种二级联动案例(jQuery\Array\Ajax php)
2016/08/13 Javascript
微信小程序开发之实现选项卡(窗口顶部TabBar)页面切换
2016/11/25 Javascript
原生js实现无缝轮播图效果
2017/01/11 Javascript
vue axios 二次封装的示例代码
2017/12/08 Javascript
ExtJs整合Echarts的示例代码
2018/02/27 Javascript
详解react关于事件绑定this的四种方式
2018/03/09 Javascript
vue.js数据绑定操作详解
2018/04/23 Javascript
AngularJS实现的base64编码与解码功能示例
2018/05/17 Javascript
JavaScript 下载svg图片为png格式
2018/06/21 Javascript
详解关于element el-button使用$attrs的一个注意要点
2018/11/09 Javascript
React精髓!一篇全概括小结(急速)
2019/05/23 Javascript
JS学习笔记之贪吃蛇小游戏demo实例详解
2019/05/29 Javascript
js实现双色球效果
2020/08/02 Javascript
JavaScript实现原型封装轮播图
2020/12/27 Javascript
[15:46]教你分分钟做大人——沙王
2015/03/11 DOTA
python同时给两个收件人发送邮件的方法
2015/04/30 Python
python实现简单socket通信的方法
2016/04/19 Python
python使用tkinter实现简单计算器
2018/01/30 Python
python爬取基于m3u8协议的ts文件并合并
2019/04/26 Python
在交互式环境中执行Python程序过程详解
2019/07/12 Python
Python编写通讯录通过数据库存储实现模糊查询功能
2019/07/18 Python
通过字符串导入 Python 模块的方法详解
2019/10/27 Python
解决Tensorflow占用GPU显存问题
2020/02/03 Python
Python tkinter和exe打包的方法
2020/02/05 Python
HTML5 视频播放(video),JavaScript控制视频的实例代码
2018/10/08 HTML / CSS
日本土著品牌,综合型购物网站:Cecile
2016/08/23 全球购物
美国钻石商店:Zales
2016/11/20 全球购物
Booking.com美国:全球酒店预订网站
2017/04/18 全球购物
欧洲第一中国智能手机和平板电脑网上商店:CECT-SHOP
2018/01/08 全球购物
简述使用ftp进行文件传输时的两种登录方式?它们的区别是什么?常用的ftp文件传输命令是什么?
2016/11/20 面试题
Apache Hudi的多版本清理服务彻底讲解
2022/03/31 Servers