vue中组件传值

2019-08-12  本文已影响0人  guoss

1.父组件向子组件传值(假设子组件是child)
父组件中首先引入子组件,通过在components中注册子组件

<template>
  <div>
    父组件:
    <input type="text" v-model="name">
    <br>
    <br>
    <!-- 引入子组件 -->
    <child :name="name"></child>
  </div>
</template>
<script>
   export default {
    data () {
        return {
          name: ''
        }
     },
      components: {
        child
      }
    }
</script>

在子组件中

<template>
  <div>
    子组件:
    <span>{{name}}</span>
  </div>
</template>
<script>
  export default  {
    // 接受父组件的值
    props: ['name']
  }
</script>

props的形式

props:  {
  name: {
    required: false,
    default: false,
    type: String 
  }
}
或者是下面的都是可以的
 props: ['name']

2.子组件向父组件传值

<template>
  <div>
    <!-- 子组件: -->
    <span>{{childValue}}</span>
    <!-- 子组件传值的方法 -->
    <input type="button" value="点击触发" @click="childClick">
  </div>
</template>
<script>
  export default {
    data () {
      return {
        childValue: '我是子组件的数据'
      }
    },
    methods: {
      childClick () {
        // childFunction是在父组件on监听的方法
        // 第二个参数this.childValue是需要传的值
        this.$emit('childFunction', this.childValue)
      }
    }
  }
</script>

在父组件中

<template>
  <div>
    父组件:
    <span>{{name}}</span>
    <!-- 引入子组件 定义监听子组件变化的函数-->
    <child @childFunction="childFunction"></child>
  </div>
</template>
<script>
  import child from './child'
  export default {
    components: {
      child
    },
    data () {
      return {
        name: ''
      }
    },
    methods: {
      childFunction: function (childValue) {
        // childValue就是子组件传过来的值
        this.name = childValue
      }
    }
  }
</script>

3.非父子组件的传值
主要通过公共的vue实例进行传值
新建bus.js

import Vue from 'vue'
export default new Vue()

在组件A中

<template>
  <div>
    A组件:
    <span>{{value}}</span>
    <input type="button" value="点击触发" @click="valueChange">
  </div>
</template>
<script>
  // 引入公共的bus,来做为中间传达的工具
  import Bus from './bus.js'
  export default {
    data () {
      return {
        value: 1
      }
    },
    methods: {
      valueChange() {
      // 发出dataChange事件
        Bus.$emit('dataChange', this.value)  
      }
    }
  }
</script>

在B组件中

<template>
  <div>
    B组件:
    <input type="button" value="点击触发" @click="getData">
    <span>{{name}}</span>
  </div>
</template>
<script>
  import Bus from './bus.js'
  export default {
    data () {
      return {
        name: 0
      }
    },
    mounted: function () {
      var vm = this
      // 用$on事件来监听dataChange事件的变化
      Bus.$on('dataChange', (data) => {
        console.log(data)
        vm.name = data
      })
    },
    methods: {
      getData () {
        console.log(this.name)
      }
    }
  }
</script>
上一篇 下一篇

猜你喜欢

热点阅读