Vuejs第九篇之组件作用域及props数据传递实例详解


Posted in Javascript onSeptember 05, 2016

本篇资料来于官方文档:

http://cn.vuejs.org/guide/components.html#Props

本教程是小编结合官方文档整理的一套更加细致,代码更多更全的教程,特别适合新手阅读。

props数据传递

①组件实例的作用域:

是孤立的,简单的来说,组件和组件之间,即使有同名属性,值也不共享。

<div id="app"> 
<add></add> 
<del></del> 
</div> 
<script> 
var vm = new Vue({ 
el: '#app', 
components: { 
"add": { 
template: "<button>btn:{{btn}}</button>", 
data: function () { 
return {btn: "123"}; 
} 
}, 
del: { 
template: "<button>btn:{{btn}}</button>", 
data: function () { 
return {btn: "456"}; 
} 
} 
} 
}); 
</script>

渲染结果是:

2个按钮,第一个的值是123,第二个的值是456(虽然他们都是btn)

②使用props绑定静态数据:

【1】这种方法用于传递字符串,且值是写在父组件自定义元素上的。

【2】下面示例中的写法,不能传递父组件data属性中的值

【3】会覆盖模板的data属性中,同名的值。

示例代码:

<div id="app"> 
<add btn="h"></add> 
</div> 
<script> 
var vm = new Vue({ 
el: '#app', 
data: { 
h: "hello" 
}, 
components: { 
"add": { 
props: ['btn'], 
template: "<button>btn:{{btn}}</button>", 
data: function () { 
return {btn: "123"}; 
} 
} 
} 
}); 
</script>

这种写法下,btn的值是h,而不是123,或者是hello。

【4】驼峰写法

假如插值是驼峰式的,

而在html标签中,由于html的特性是不区分大小写(比如LI和li是一样的),因此,html标签中要传递的值要写成短横线式的(如btn-test),以区分大小写。

而在props的数组中,应该和插值保持一致,写成驼峰式的(如btnTest)。

例如:

props: ['btnTest'], 
template: "<button>btn:{{btnTest}}</button>",

正确的写法:

<add btn-test="h"></add>

假如插值写短横线式,或者是html标签写成驼峰式,都不能正常生效。(除非插值不写成驼峰式——跳过大小写的限制,才可以)

③利用props绑定动态数据:

简单来说,就是让子组件的某个插值,和父组件的数据保持一致。

标准写法是(利用v-bind):

<add v-bind:子组件的值="父组件的属性"></add>

如代码

<div id="app"> 
<add v-bind:btn="h"></add> 
</div> 
<script> 
var vm = new Vue({ 
el: '#app', 
data: { 
h: "hello" 
}, 
components: { 
"add": { 
props: ['btn'], 
template: "<button>btn:{{btn}}</button>", 
data: function () { 
return {'btn': "123"}; //子组件同名的值被覆盖了 
} 
} 
} 
}); 
</script>

说明:

【1】btn使用的父组件data中 h的值;

【2】子组件的data的函数中返回值被覆盖了。

【3】也就是说,使用v-bind的是使用父组件的值(根据属性名),没有使用v-bind的是将标签里的数值当做字符串来使用。

【4】依然需要使用props,否则他会取用自己data里的btn的值

④字面量和动态语法:

【1】简单来说,不加v-bind的,传递的是字面量,即当做字符串(例如1也是字符串,而不是number类型);

【2】加上v-bind的,传递的是JS表达式(因此才能传递父组件的值);

【3】加上v-bind后,如果能找到父组件的值,那么使用父组件的值;如果没有对应的,则将其看做一个js表达式(例如1+2看做3,{a:1}看做是一个对象);

如代码:

<div id="app"> 
<add v-bind:btn="1+2"></add> 
</div> 
<script> 
var vm = new Vue({ 
el: '#app', 
data: { 
h: "hello" 
}, 
components: { 
"add": { 
props: ['btn'], 
template: "<button>btn:{{btn}}</button>" 
} 
} 
}); 
</script>

这里的btn的值是3(而不是没有加v-bind时,作为字符串的1+2)

⑤props的绑定类型:

【1】简单来说,分为两种类型,即单向绑定(父组件能影响子组件,但相反不行)和双向绑定(子组件也能影响父组件);

【2】单向绑定示例:(默认,或使用.once)

<div id="app"> 
父组件: 
<input v-model="val"><br/> 
子组件: 
<test v-bind:test-Val="val"></test> 
</div> 
<script> 
var vm = new Vue({ 
el: '#app', 
data: { 
val: 1 
}, 
components: { 
"test": { 
props: ['testVal'], 
template: "<input v-model='testVal'/>" 
} 
} 
}); 
</script>

说明:

当父组件的值被更改后,子组件的值也随之更改;

当子组件的值被更改后,父组件的值不会变化,而假如再次修改父组件的值,子组件会再次同步。

另外需要注意的是,子组件如果要同步绑定,那么子组件的input需要是v-model,而不能是value属性(那样只能单项绑定,且修改子组件的值后会失去绑定)

【3】双向绑定:

需要使用“.sync”作为修饰词

如示例:

<div id="app"> 
父组件: 
<input v-model="val"><br/> 
子组件: 
<test :test.sync="val"></test> 
</div> 
<script> 
var vm = new Vue({ 
el: '#app', 
data: { 
val: 1 
}, 
components: { 
"test": { 
props: ['test'], 
template: "<input v-model='test'/>" 
} 
} 
}); 
</script>

效果是无论你改哪一个的值,另外一个都会随之变动。

【4】props验证:

简单来说,当组件获取数据时,进行验证,只有符合条件的时候,才会使用之。

写法是将props变为一个对象,被验证是值是对象的key,验证条件是和key对应的value。

例如:

props: { 
test: { 
twoWay: true 
} 
},

验证test这个变量是不是双向绑定,如果不是,则报错。(注意,这个不能用于验证单向绑定)。

示例代码如下:

<div id="app"> 
父组件: 
<input v-model="val"><br/> 
子组件: 
<test :test="val"></test> 
</div> 
<script> 
var vm = new Vue({ 
el: '#app', 
data: { 
val: 1 
}, 
components:{ 
test:{ 
props: { 
test: { 
twoWay: true 
} 
}, 
template: "<input v-model='test'/>" 
} 
} 
}); 
</script>

更多验证类型请查看官方教程:

http://cn.vuejs.org/guide/components.html#Prop__u9A8C_u8BC1

以上所述是小编给大家介绍的Vuejs第九篇之组件作用域及props数据传递实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jQuery不间断滚动效果(模拟百度新闻支持文字/图片/垂直滚动)
Feb 05 Javascript
javascript实现促销倒计时+fixed固定在底部
Sep 18 Javascript
Jjcarousellite 实现图片列表滚动的简单实例
Nov 29 Javascript
从数据库读取数据后将其输出成html标签的三种方法
Oct 13 Javascript
js实现拖拽效果
Feb 12 Javascript
javascript实现简单加载随机色方块
Dec 25 Javascript
实现高性能JavaScript之执行与加载
Jan 30 Javascript
全面解析JavaScript的Backbone.js框架中的Router路由
May 05 Javascript
简单掌握JavaScript中const声明常量与变量的用法
May 21 Javascript
JavaScript事件处理程序详解
Sep 19 Javascript
JS逻辑运算符短路操作实例分析
Jul 09 Javascript
mpvue全局引入sass文件的方法步骤
Mar 06 Javascript
AngularJS实现标签页的两种方式
Sep 05 #Javascript
Vuejs第八篇之Vuejs组件的定义实例解析
Sep 05 #Javascript
详细谈谈AngularJS的子级作用域问题
Sep 05 #Javascript
Vuejs第七篇之Vuejs过渡动画案例全面解析
Sep 05 #Javascript
JS简单获取客户端IP地址的方法【调用搜狐接口】
Sep 05 #Javascript
JS简单随机数生成方法
Sep 05 #Javascript
使用React实现轮播效果组件示例代码
Sep 05 #Javascript
You might like
支持oicq头像的留言簿(一)
2006/10/09 PHP
php读取mysql中文数据出现乱码的解决方法
2013/08/16 PHP
PHP实现对png图像进行缩放的方法(支持透明背景)
2015/07/15 PHP
js 加载并解析XML字符串的代码
2009/12/13 Javascript
可以将word转成html的js代码
2010/04/11 Javascript
基于jquery实现漂亮的动态信息提示效果
2011/08/02 Javascript
JS文本框不能输入空格验证方法
2013/03/19 Javascript
如何使用jQUery获取选中radio对应的值(一句代码)
2013/06/03 Javascript
jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮
2013/10/11 Javascript
JS的document.all函数使用示例
2013/12/30 Javascript
Javascript中的几种URL编码方法比较
2015/01/23 Javascript
Javascript动态创建div的方法
2015/02/09 Javascript
jQuery使用元素属性attr赋值详解
2015/02/27 Javascript
JQuery实现简单的图片滑动切换特效
2015/11/22 Javascript
jQuery中的ready函数与window.onload谁先执行
2016/06/21 Javascript
js实现音乐播放控制条
2017/09/09 Javascript
vue中动态select的使用方法示例
2019/10/28 Javascript
Python中的各种装饰器详解
2015/04/11 Python
在Python中使用base64模块处理字符编码的教程
2015/04/28 Python
判断网页编码的方法python版
2016/08/12 Python
Django学习笔记之ORM基础教程
2018/03/27 Python
如何在Django配置文件里配置session链接
2019/08/06 Python
python单例模式原理与创建方法实例分析
2019/10/26 Python
Python获取对象属性的几种方式小结
2020/03/12 Python
Django用户登录与注册系统的实现示例
2020/06/03 Python
python实现逻辑回归的示例
2020/10/09 Python
世界领先的高品质定制产品平台:Zazzle
2017/07/23 全球购物
洛杉矶生活休闲而精致的基础品牌:Mika Jaymes
2018/01/07 全球购物
银行实习鉴定
2013/12/13 职场文书
工程管理专业毕业生自荐信
2014/01/24 职场文书
小区门卫管理制度
2014/01/29 职场文书
办公室打字员岗位职责
2014/04/16 职场文书
2015年学校政教工作总结
2015/07/20 职场文书
用Python爬取各大高校并可视化帮弟弟选大学,弟弟直呼牛X
2021/06/11 Python
一次MySQL启动导致的事故实战记录
2021/09/15 MySQL
Win11怎么启动任务管理器?Win11启动任务管理器的几种方法
2021/11/23 数码科技