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禁用右键示例
Apr 28 Javascript
jquery实现聚光灯效果的方法
Feb 06 Javascript
jQuery插件PageSlide实现左右侧栏导航菜单
Apr 12 Javascript
JS实现生成会变大变小的圆环实例
Aug 05 Javascript
js下拉选择框与输入框联动实现添加选中值到输入框的方法
Aug 17 Javascript
Node连接mysql数据库方法介绍
Feb 07 Javascript
javascript事件的传播基础实例讲解(35)
Feb 14 Javascript
深入理解vue Render函数
Jul 19 Javascript
Vue.js框架路由使用方法实例详解
Aug 25 Javascript
vue中使用iview自定义验证关键词输入框问题及解决方法
Mar 26 Javascript
javascript实现函数柯里化与反柯里化过程解析
Oct 08 Javascript
原生JavaScript实现五子棋游戏
Nov 09 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获取从百度搜索进入网站的关键词的详细代码
2014/01/08 PHP
php中有关字符串的4个函数substr、strrchr、strstr、ereg介绍和使用例子
2014/04/24 PHP
php冒泡排序、快速排序、快速查找、二维数组去重实例分享
2014/04/24 PHP
php字符串函数学习之substr()
2015/03/27 PHP
magento后台无法登录解决办法的两种方法
2016/12/09 PHP
Yii2实现跨mysql数据库关联查询排序功能代码
2017/02/10 PHP
js正文内容高亮效果的实现方法
2013/06/30 Javascript
js 一个关于图片onload加载的事
2013/11/10 Javascript
设置jsf的选择框h:selectOneMenu为不可编辑状态的方法
2014/01/07 Javascript
JavaScript使用DeviceOne开发实战(二) 生成调试安装包
2015/12/01 Javascript
node+express制作爬虫教程
2016/11/11 Javascript
Angularjs的$http异步删除数据详解及实例
2017/07/27 Javascript
JavaScript实现动态添加Form表单元素的方法示例
2017/08/14 Javascript
JavaScript你不知道的一些数组方法
2017/08/18 Javascript
vue.js整合vux中的上拉加载下拉刷新实例教程
2018/01/09 Javascript
vue+springboot前后端分离实现单点登录跨域问题解决方法
2018/01/30 Javascript
使用veloticy-ui生成文字动画效果
2018/02/08 Javascript
angular 组件通信的几种实现方式
2018/07/13 Javascript
Angular封装搜索框组件操作示例
2019/04/25 Javascript
vue cli 3.0 搭建项目的图文教程
2019/05/17 Javascript
Vue.js 无限滚动列表性能优化方案
2019/12/02 Javascript
[04:48]DOTA2亚洲邀请赛林书豪为VGJ加油
2017/04/01 DOTA
python操作MySQL数据库的方法分享
2012/05/29 Python
Python常用模块介绍
2014/11/21 Python
Python NumPy库安装使用笔记
2015/05/18 Python
Linux下用Python脚本监控目录变化代码分享
2015/05/21 Python
基于Python os模块常用命令介绍
2017/11/03 Python
PyInstaller的安装和使用的详细步骤
2020/06/02 Python
Python3+Flask安装使用教程详解
2021/02/16 Python
CSS3利用text-shadow属性实现多种效果的文字样式展现方法
2016/08/25 HTML / CSS
iframe与window.onload如何使用详解
2020/05/07 HTML / CSS
个人求职简历的自我评价范文
2013/10/09 职场文书
小松树教学反思
2014/02/11 职场文书
2014年学生会干事工作总结
2014/11/07 职场文书
python如何正确使用yield
2021/05/21 Python
apache虚拟主机配置的三种方式(小结)
2022/07/23 Servers