美文网首页
vue中的组件通讯问题

vue中的组件通讯问题

作者: 前端Tree | 来源:发表于2019-11-26 23:14 被阅读0次

一、父组件数据流向自组件

<script>
    // 需求: 父组件将数据传递给子组件
    // 父组件: Vue实例
    // 子组件: hello组件

    // 通过属性传递的方式,来实现父子组件的通讯
    // 1 在组件中通过 props 配置项,来说明该组件能够接受什么样的数据
    // 2 在使用组件的时候,通过 属性 的方式,来给组件传递数据

    // 注意:props是只读属性!!!无法修改

    Vue.component('hello', {
      template: `
        <div>
          <h1>这是子组件:hello</h1>
          <p>子组件使用父组件中的数据msg: {{ parentmsg }} , {{ test }}</p>
        </div>
      `,

      created() {
        console.log('接收到属性:', this.parentmsg)
        
        // 如果直接修改 props 的值,会报错!!!
        // this.parentmsg = '修改了值'
      },
      
      // 通过该配置执行组件能够接受的数据
      // props 的使用跟 data 中的数据一样
      props: ['parentmsg', 'test']
    })

    const vm = new Vue({
      el: '#app',
      data: {
        msg: '实例数据'
      }
    })
  </script>

二、子组件数据流向父组件 ---完整案例

<!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">
    <h1>父组件接受到子组件传递过来的数据:{{ msg }}</h1>

    <!-- 渲染组件 -->
    <!-- 2 将父组件中准备好的方法作为自定义事件传递给子组件 -->
    <child @fn="fn"></child>
  </div>
  <script src="./vue.js"></script>
  <script>
    Vue.component('child', {
      template: `
        <div>
          <input v-model="txt" />
          <button @click="send">传递数据给父组件</button>
        </div>
      `,

      data() {
        return {
          txt: ''
        }
      },

      methods: {
        send() {
          // 3 子组件触发传递过来的自定义事件 fn
          this.$emit('fn', this.txt)
        }
      }
    })

    const vm = new Vue({
      el: '#app',
      data: {
        msg: ''
      },

      methods: {
        // 1 父组件提供一个方法
        fn(arg) {
          console.log('接受到子组件数据为:', arg)
          this.msg = arg
        }
      }
    })
  </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>
    // 非父子组件(兄弟组件):
    // 场景:jack组件要对rose组件说: 'i love u'
    // 发送数据的组件:jack,触发事件,传递数据
    // 接受数据的组件:rose,注册事件

    // 思路:
    // 1 rose组件要接受数据,因此,rose组件注册事件 bus.$on('love', () => {})
    // 2 jack组件要传递数据,因此,jack组件触发事件 bus.$emit('love', '要传递的数据')

    // 创建一个bus
    // bus 实际上就是一个空的vue实例
    // 注意: 注册事件和触发事件需要使用同一个bus
    const bus = new Vue()

    // jack组件
    Vue.component('jack', {
      template: `
        <div>
          <h2>Jack组件:</h2>
          <button @click="sendLove">告诉rose:i love u</button>
        </div>
      `,

      methods: {
        sendLove() {
          // jack触发事件,将数据作为参数传递
          bus.$emit('love', 'i love u')
        }
      }
    })
    
    // rose组件
    Vue.component('rose', {
      template: `
        <div>
          <h2>Rose组件:</h2>
          <p>我是rose,jack你说啥??? {{ msg }}</p>
        </div>
      `,

      created() {
        // 进入页面就注册事件
        bus.$on('love', (arg) => {
          this.msg = arg
        })
      },

      data() {
        return {
          msg: ''
        }
      }
    })

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

相关文章

网友评论

      本文标题:vue中的组件通讯问题

      本文链接:https://www.haomeiwen.com/subject/illuwctx.html