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 相关文章推荐
innerText 使用示例
Jan 23 Javascript
JavaScript格式化日期时间的方法和自定义格式化函数示例
Apr 04 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件包装
Nov 20 Javascript
使用angularjs创建简单表格
Jan 21 Javascript
微信小程序 form组件详解及简单实例
Jan 10 Javascript
BootStrap表单控件之复选框checkbox和单选择按钮radio
May 23 Javascript
详解使用webpack打包编写一个vue-toast插件
Nov 08 Javascript
详解angular部署到iis出现404解决方案
Aug 14 Javascript
移动端如何用下拉刷新的方式实现上拉加载
Dec 10 Javascript
ES6实现图片切换特效代码
Jan 14 Javascript
Nuxt配置Element-UI按需引入的操作方法
Jul 06 Javascript
vue route新窗口跳转页面并且携带与接收参数
Apr 10 Vue.js
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数据结构之顺序链表与链式线性表示例
2018/01/22 PHP
javascript 用记忆函数快速计算递归函数
2010/03/15 Javascript
javascript 数组学习资料收集
2010/04/11 Javascript
用JavaScript对JSON进行模式匹配(Part 1-设计)
2010/07/17 Javascript
使用滤镜设置透明导致 IE 6/7/8/9 解析异常的解决方法
2011/04/07 Javascript
javascript (用setTimeout而非setInterval)
2011/12/28 Javascript
前台js改变Session的值(用ajax实现)
2012/12/28 Javascript
jQuery Mobile页面跳转后未加载外部JS原因分析及解决
2013/03/18 Javascript
jQuery中:disabled选择器用法实例
2015/01/04 Javascript
你所未知的3种Node.js代码优化方式
2016/02/25 Javascript
jQuery实现点击表格单元格就可以编辑内容的方法【测试可用】
2016/08/01 Javascript
Vue.js快速入门教程
2016/09/07 Javascript
jQuery插件form-validation-engine正则表达式操作示例
2017/02/09 Javascript
Angular.js实现获取验证码倒计时60秒按钮的简单方法
2017/10/18 Javascript
基于vue-cli创建的项目的目录结构及说明介绍
2017/11/23 Javascript
JS排序算法之希尔排序与快速排序实现方法
2017/12/12 Javascript
vue3.0生命周期的示例代码
2020/09/24 Javascript
vue中h5端打开app(判断是安卓还是苹果)
2021/02/26 Vue.js
Python实现遍历目录的方法【测试可用】
2017/03/22 Python
Python_LDA实现方法详解
2017/10/25 Python
python topN 取最大的N个数或最小的N个数方法
2018/06/04 Python
python实现从文件中读取数据并绘制成 x y 轴图形的方法
2018/10/14 Python
Python Web框架之Django框架Model基础详解
2019/08/16 Python
浅谈Python的方法解析顺序(MRO)
2020/03/05 Python
Python 去除字符串中指定字符串
2020/03/05 Python
python能做哪方面的工作
2020/06/15 Python
Topman美国官网:英国著名的国际平价时尚男装品牌
2017/12/22 全球购物
Watchshop德国:欧洲在线手表No.1
2019/06/20 全球购物
Molly Bracken法国电子商店:法国女性时尚品牌
2019/07/24 全球购物
成人大专自我鉴定范文
2013/10/19 职场文书
室内设计专业学生的自我评价分享
2013/11/27 职场文书
经典团队口号大全
2014/06/21 职场文书
临床专业自荐信
2014/06/22 职场文书
协会周年庆活动方案
2014/08/26 职场文书
企业宣传语大全
2015/07/13 职场文书
公司档案管理制度
2015/08/05 职场文书