vue组件传参

333 阅读2分钟

父传子

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>

<body>
  <div id="app">
    <!-- 1. 父组件在子组件的身上定义一个属性即可 -->
    {{msg}}
    <son desc="哈哈" money="10000" :msg="msg"></son>
  </div>

  <script src="vue.js"></script>
  <script>
    /* 
      1. 父组件在子组件的身上定义一个属性即可
      2. 子组件需要指定一个 props 属性
    */
    // 组件通讯-父传子
    Vue.component('son', {
      // data methods computed
      template: `
        <div>
          这是子组件
          {{ desc }} ----- {{ money }}  ---- {{msg}}
        </div>
      `,
      // 2. 子组件需要指定一个 props 属性
      // props的作用和data的作用是一样的,也是用来给组件(实例)提供数据,props的数据接收自父组件
      props: ['desc', 'money', 'msg']
    })

    const vm = new Vue({
      el: '#app',
      data: {
        msg: 'hello vue'
      }
    })
  </script>
</body>

</html>

子传父

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <!-- 2. 子传父:父组件给子组件注册一个事件(目的:把方法传递给子组件)  -->
    <son @sb="get"></son>
  </div>

  <script src="vue.js"></script>
  <script>
    /* 
      1. 父组件提供一个方法, 作用:获取数据
      2. 父组件给子组件注册一个事件 事件名可以随便取
      3. 子组件触发父组件注册的事件即可 (this.$emit), 可以传递参数
      4. 父组件通过形参来获取数据
    */
    // 需求:把son组件的 money, car都传递给父组件
    Vue.component('son', {
      template: `
        <div>
          <button @click="fn">给父组件传递数据</button>
        </div>
      `,
      data() {
        return {
          money: 10000,
          car: '凤凰'
        }
      },
      methods: {
        fn() {
          // 3. 子传父: 子组件触发父组件注册的事件(sb)
          console.log(111)
          // $emit:表示触发当前注册自己的某个事件
          this.$emit('sb', this.money, this.car)
        }
      }
    })
    const vm = new Vue({
      el: '#app',
      data: {
        msg: 'hello vue'
      },
      // 1. 子传父: 父组件提供一个方法
      methods: {
        get(money, car) {
          console.log('来自于我孩子的', money, car)
        }
      }
    })
  </script>
</body>
</html>

非父子

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>

<body>
  <div id="app">
    <jack></jack>
    <rose></rose>
  </div>

  <script src="vue.js"></script>
  <script>
    /*
      1. 创建一个事件总线 bus   const bus = new Vue
      2. 需要获取数据的组件,rose提供一个方法,用于获取数据
      3. 在组件渲染的时候,就给bus注册一个自定义的事件  bus.$on
      4. 需要传递数据的组件去触发bus的这个自定义事件
    */
    //1. 创建一个事件总线, bus其实就是一个空的vue实例
    const bus = new Vue()

    Vue.component('jack', {
      template: `
        <div>
          <p>这是jack组件</p>
          <button @click="fn">对rose说</button>
        </div>
      `,
      data() {
        return {
          msg: '你赶紧跳吧!'
        }
      },
      methods: {
        fn() {
          // console.log('发送给rose', this.msg)
          // 4. jack触发bus的get事件
          bus.$emit('ss', this.msg)
        }
      }
    })

    Vue.component('rose', {
      template: `
        <div>
          <p>这是rose组件</p>
        </div>
      `,
      methods: {
        // 2. rose提供了一个方法
        get(msg) {
          console.log('接收到了jack的消息', msg)
        }
      },
      created() {
        // 3. rose在创建的时候,就bus注册一个事件
        // 参数1:事件名
        // 参数2: 事件处理程序(在上面)
        bus.$on('ss', this.get)
      }
    })


    // bus是组件通讯的一种通用解决方案
    const vm = new Vue({
      el: '#app',
      data: {
        msg: 'hello vue'
      }
    })


  </script>
</body>

</html>