vue 2.0 父子组件传值

在Vue中组件实例之间的作用域是孤立的,以为不能直接在子组件上引用父组件的数据,同时父组件也不能直接使用子组件的数据

一、父组件利用props往子组件传输数据

父组件:

<div>
  <child v-bind:my-message="parentMsg"></child>//注意传递参数时要用—代替驼峰命名,HTML不区分大小写
</div>

子组件:

Vue.component('child', {
  // camelCase in JavaScript
  props:{myMessage},
  template: '<span>{{ myMessage }}</span>'
})

如上所示,父组件在模板中引用子组件,通过v-bind传递参数myMessage,值为parentMsg,其可以为父组件中的动态属性,同时不用v-bind直接myMessage="hello传递静态值给子组件,则传递的值就是hello字符串。在利用props实现传值的过程中理论上是要实现单向传递,即父组件改变相关参数的值,子组件也相应变化,但是子组件对参数的改变不应该影响父组件。但是当props中接收的是父组件传递的引用类型(对象或者是数组)时,在子组件中对数据改变时,父组件中的数据也会相应的改变,因为两者是指向的同一地址内存。如果不想子组件的改变影响父组件可以利用深拷贝,将接受的数据进行深拷贝后在子组件中使用,而不直接操作接受的数据。深拷贝可以直接利用ES6中的obj=Object。assign({},myMessage)(在computed中定义),这样子组件的改动将不会影响到父组件。

二、子组件向父组件传递参数利用事件机制

子组件通过this.$emit()派发事件,父组件利用v-on对事件进行监听,实现参数的传递

子组件:

   this.$emit('changeCart',event.target)/*向父组件派发事件,同时传递参数event.target,后面的参数的个数不限*/

父组件:

<v-cartcontrol :food="food" v-on:changeCart="changeCart"></v-cartcontrol>

同时当有组件嵌套时则需要利用该机制一层一层的触发到指定层,不然直接在顶层监听子组件的子组件的事件是监听不到的,需要先向父组件派发,父组件在向上层触发

 

三、利用ref属性可以获取到dom元素或者是子组件,从而可以调用子组件的方法(注意2.0版本用ref取代了el)

 1、当ref直接定义在dom元素上时,则通过this.$refs.name可以获取到dom对dom进行原生的操作

[html]  view plain  copy
  1. <div class="foods-wrapper" ref="foods-wrapper">  

 通过this.$refs获取到dom进行操作(注意ref属性的命名不能用驼峰,同时获取的时候也是)

[html]  view plain  copy
  1. let menuList=this.$refs['menu-wrapper'].getElementsByClassName('menu-list-hook');//<span style="background-color:#ff0000;">此处如果用this.$refs["menuWrapper"]将获取不到元素  
  2. span>  

 2、通过在引用的子组件上使用ref属性实现父组件调用子组件的方法以及属性

在父组件中引用子组件并定义ref

[html]  view plain  copy
  1. <v-food  ref="selectfood"></v-food>  

调用定义在子组件中的方法show

[html]  view plain  copy
  1. this.$refs.selectfood.show();//同时也可以调用子组件中的属性  

 声明下上面说的是vue 2.0

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 2.0父子组件之间的传值可以通过属性(prop)和事件(event)实现。 1. 属性(prop)传递值 组件通过在子组件上定义prop属性,指定要传递的值类型和名字,然后将值传递给子组件prop属性。子组件通过props接收到组件传递的值,可以直接使用。 例如:组件中定义一个名为message的prop属性,值为字符串类型,在模板中通过子组件标签向子组件传递值。 ``` // 组件 <template> <div> <child-component :message="hello"></child-component> </div> </template> <script> import ChildComponent from './child-component.vue' export default { components: { ChildComponent }, data () { return { hello: 'hello, world' } } } </script> // 子组件 <template> <div>{{ message }}</div> </template> <script> export default { props: { message: { type: String, require: true } } } </script> ``` 2. 事件(event)传递值 组件通过定义一个事件,在子组件中触发该事件并传递需要传递的值。子组件组件中使用子组件自定义的事件,并获取到传递的值。 例如:子组件定义一个自定义事件,触发时传递一个字符串类型的值。组件中使用子组件,同时监听子组件的自定义事件,在事件回调函数中获取到子组件传递的值。 ``` // 子组件 <template> <button @click="changeMessage()">改变消息</button> </template> <script> export default { methods: { changeMessage () { this.$emit('change', '新消息') } } } </script> // 组件 <template> <div> <child-component @change="handleChange"></child-component> <div>{{ message }}</div> </div> </template> <script> import ChildComponent from './child-component.vue' export default { components: { ChildComponent }, data () { return { message: '旧消息' } }, methods: { handleChange (newValue) { this.message = newValue } } } </script> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值