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 相关文章推荐
tagName的使用,留一笔
Jun 26 Javascript
JavaScript接口实现代码 (Interfaces In JavaScript)
Jun 11 Javascript
jquery触发a标签跳转事件示例代码
Jul 21 Javascript
jquery文本框中的事件应用以输入邮箱为例
May 06 Javascript
JS控制弹出新页面窗口位置和大小的方法
Mar 02 Javascript
AngularJs实现ng1.3+表单验证
Dec 10 Javascript
jQuery表格插件datatables用法详解
Nov 23 Javascript
jQuery如何获取动态添加的元素
Jun 24 Javascript
vue对storejs获取的数据进行处理时遇到的几种问题小结
Mar 20 Javascript
vue form check 表单验证的实现代码
Dec 09 Javascript
深入理解Vue keep-alive及实践总结
Aug 21 Javascript
Vue循环遍历选项赋值到对应控件的实现方法
Jun 22 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
PHP中限制IP段访问、禁止IP提交表单的代码
2011/04/23 PHP
CodeIgniter CLI模式简介
2014/06/17 PHP
Laravel 已登陆用户再次查看登陆页面的自动跳转设置方法
2019/09/30 PHP
javascript 实现父窗口引用弹出窗口的值的脚本
2007/08/07 Javascript
javascript parseInt 大改造
2009/09/27 Javascript
原来Jquery.load的方法可以一直load下去
2011/03/28 Javascript
JQuery里选择超链接的实现代码
2011/05/22 Javascript
jquery $(this).attr $(this).val方法使用介绍
2013/10/08 Javascript
JS中的form.submit()不能提交表单的错误原因
2014/10/08 Javascript
jQuery对JSON数据进行排序输出的方法
2015/06/24 Javascript
js图片轮播手动切换效果
2015/11/10 Javascript
AngularJS身份验证的方法
2016/02/17 Javascript
将JSON字符串转换成Map对象的方法
2016/11/30 Javascript
详解vue组件开发脚手架
2018/06/15 Javascript
微信小程序实践之动态控制组件的显示/隐藏功能
2018/07/18 Javascript
Vue-Cli 3.0 中配置高德地图的两种方式
2019/06/19 Javascript
JS前端知识点总结之页面加载事件,数组操作,DOM节点操作,循环和分支
2019/07/04 Javascript
js贪心算法 钱币找零问题代码实例
2019/09/11 Javascript
Vue实现导航栏的显示开关控制
2019/11/01 Javascript
在vue中利用v-html按分号将文本换行的例子
2019/11/14 Javascript
[13:39]2014 DOTA2华西杯精英邀请赛 5 25 NewBee VS DK第一场
2014/05/26 DOTA
[58:35]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
python删除文件示例分享
2014/01/28 Python
基于Python实现的ID3决策树功能示例
2018/01/02 Python
Python多进程fork()函数详解
2019/02/22 Python
python rolling regression. 使用 Python 实现滚动回归操作
2020/06/08 Python
Python实现画图软件功能方法详解
2020/07/28 Python
canvas绘制表情包的示例代码
2018/07/09 HTML / CSS
Janie and Jack美国官网:GAP旗下的高档童装品牌
2019/09/09 全球购物
英国户外服装、鞋类和设备的领先零售商:Millets
2020/10/12 全球购物
What is the purpose of Void class? Void类的作用是什么?
2016/10/31 面试题
什么时候需要进行强制类型转换
2016/09/03 面试题
2014自荐信的写作技巧
2014/01/28 职场文书
同学会主持词
2014/03/18 职场文书
2016继续教育培训学习心得体会
2016/01/19 职场文书
营销策划分析:怎么策划才能更好销量产品?
2019/09/04 职场文书