Vuejs 组件——props数据传递的实例代码


Posted in Javascript onMarch 07, 2017

本篇资料来于官方文档: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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript 面向对象特性
Dec 28 Javascript
JSON 数据格式介绍
Jan 13 Javascript
JavaScript中的typeof操作符用法实例
Apr 05 Javascript
jQuery插件passwordStrength密码强度指标详解
Jun 24 Javascript
jquery 判断selection range 是否在容器中的简单实例
Aug 02 Javascript
JS实现加载和读取XML文件的方法详解
Apr 24 Javascript
bootstrap模态框示例代码分享
May 17 Javascript
浅谈Node.js 子进程与应用场景
Jan 24 Javascript
vue使用技巧及vue项目中遇到的问题
Jun 04 Javascript
微信小程序保存多张图片的实现方法
Mar 05 Javascript
node实现mock-plugin中间件的方法
Dec 25 Javascript
Vue 解决通过this.$refs来获取DOM或者组件报错问题
Jul 28 Javascript
js实现百度登录框鼠标拖拽效果
Mar 07 #Javascript
Vue获取DOM元素样式和样式更改示例
Mar 07 #Javascript
原生JavaScript实现Tooltip浮动提示框特效
Mar 07 #Javascript
基于JavaScript实现图片剪切效果
Mar 07 #Javascript
详解Vue2 无限级分类(添加,删除,修改)
Mar 07 #Javascript
js放到head中失效的原因与解决方法
Mar 07 #Javascript
Bootstrap媒体对象学习使用
Mar 07 #Javascript
You might like
php修改NetBeans默认字体的大小
2013/07/02 PHP
图解找出PHP配置文件php.ini的路径的方法
2014/08/20 PHP
php中限制ip段访问、禁止ip提交表单的代码分享
2014/08/22 PHP
php 运算符与表达式详细介绍
2016/11/30 PHP
详解CSS样式中的 !important * _ 符号
2021/03/09 HTML / CSS
javascript预览上传图片发现的问题的解决方法
2010/11/25 Javascript
JavaScript去除空格的三种方法(正则/传参函数/trim)
2013/02/06 Javascript
js 为label标签和div标签赋值的方法
2013/08/08 Javascript
深入理解JavaScript系列(43):设计模式之状态模式详解
2015/03/04 Javascript
深入理解jQuery中的事件冒泡
2016/05/24 Javascript
基于JavaScript实现在新的tab页打开url
2016/08/04 Javascript
jQuery插件zTree实现删除树子节点的方法示例
2017/03/08 Javascript
使用Nodejs连接mongodb数据库的实现代码
2017/08/21 NodeJs
Vue完整项目构建(进阶篇)
2018/02/10 Javascript
Vue使用Proxy监听所有接口状态的方法实现
2019/06/07 Javascript
JavaScript(js)处理的HTML事件、键盘事件、鼠标事件简单示例
2019/11/19 Javascript
JavaScript中使用Spread运算符的八种方法总结
2020/06/18 Javascript
Kettle中使用JavaScrip调用jar包对文件内容进行MD5加密的操作方法
2020/09/04 Javascript
nuxt 每个页面head标签内容设置方式
2020/11/05 Javascript
javascript全局自定义鼠标右键菜单
2020/12/08 Javascript
[01:45]亚洲邀请赛互动指南虚拟物品介绍
2015/01/30 DOTA
python控制台英汉汉英电子词典
2020/04/23 Python
基于python的socket实现单机五子棋到双人对战
2020/03/24 Python
Python爬虫 bilibili视频弹幕提取过程详解
2019/07/31 Python
关于django 1.10 CSRF验证失败的解决方法
2019/08/31 Python
地图可视化神器kepler.gl python接口的使用方法
2020/12/22 Python
jupyter notebook远程访问不了的问题解决方法
2021/01/11 Python
python爬虫实现爬取同一个网站的多页数据的实例讲解
2021/01/18 Python
英国领先的葡萄酒专家:Majestic Wine
2017/05/30 全球购物
介绍一下OSI七层模型
2012/07/03 面试题
介绍一下结构化程序设计方法和面向对象程序设计方法的区别
2012/06/27 面试题
政府信息公开实施方案
2014/05/09 职场文书
财会专业毕业生自荐信
2014/07/09 职场文书
2014年仓库工作总结
2014/11/20 职场文书
解决MySQL存储时间出现不一致的问题
2021/04/28 MySQL
Nginx如何配置多个服务域名解析共用80端口详解
2022/09/23 Servers