美文网首页
组件通信

组件通信

作者: Cissy_fba3 | 来源:发表于2018-09-04 00:56 被阅读0次

1.props和emit 父子间
2.provide,inject 同级或跨级
3.vuex 同级或跨级

props和emit
image

父传子用props

Vue.component('blog-post', {
  props: ['title','key'],
  template: '<h3>{{ title }}</h3>'
})//子组件

new Vue({
  el: '#blog-post-demo',
  data: {
    posts: [
      { id: 1, title: 'My journey with Vue' },
      { id: 2, title: 'Blogging with Vue' },
      { id: 3, title: 'Why Vue is so fun' }
    ]
  }
})//根元素(父)

//html
<blog-post 
v-for="post in posts" 
v-bind:key="post.id"
v-bind:title="post.title"
></blog-post>

注意:在props中使用驼峰命名法时记得在html中换成连字符命名法

子传父用$emit()

在子组件中用 $emit()并传入事件的名字,来向父级组件触发一个事件
然后用 v-on 在父元素监听这个事件,就像监听一个原生 DOM 事件一样。

Vue.component('blog-post', {
  props: ['post'],
  template: `
    <div class="blog-post">
      <h3>{{ post.title }}</h3>
      <button v-on:click="$emit('enlarge-text')">
        Enlarge text
      </button>
      <div v-html="post.content"></div>
    </div>
  `
})
new Vue({
  el: '#blog-posts-events-demo',
  data: {
    posts: [/* ... */],
    postFontSize: 1
  }
})

//html
<blog-post
  ...
  v-on:enlarge-text="postFontSize += 0.1"
></blog-post>

emit可以发送数据,v-on监听的事件可以接收这个数据作为参数,通过 $event 访问到被抛出的这个值

组件中的button:
<button v-on:click="$emit('enlarge-text', 0.1)">
       Enlarge text
</button>

//html
<blog-post
  ...
  v-on:enlarge-text="postFontSize += $event"
></blog-post>

如果这个事件处理函数是一个方法,那么这个值将会作为第一个参数传入这个方法

<blog-post
  ...
  v-on:enlarge-text="onEnlargeText"
></blog-post>

//
methods: {
  onEnlargeText: function (enlargeAmount) {
    this.postFontSize += enlargeAmount
  }
}

注意:用$emit发送事件时最好也不要用驼峰命名法,用连字符法。

provide inject

注意:provide提供的数据是非响应式的

// 父级组件提供 'foo'
var Provider = {
  provide: {
    foo: 'bar'
  },
  // ...
}

// 子组件注入 'foo'
var Child = {
  inject: ['foo'],
  created () {
    console.log(this.foo) // => "bar"
  }
  // ...
}

要想变成响应式,在根组件中注入provide

// 根组件提供将自身提供给后代组件
export default {
  provide () {
    return {
      app: this
    }
  },
  data () {
    return {
      text: 'bar'
    }
  }
}

// 后代组件注入 'app'
<template>
    <div>{{this.app.text}}</div>
</template>
<script>
  export default {
    inject: ['app'],
    created() {
      this.app.text = 'baz' // 在模板中,显示 'baz'
    }
  }
</script>   
//出处:
//作者:格子熊
//链接:https://juejin.im/post/6844903989935341581
//来源:掘金
//著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

vue3中使用provide和inject——响应式

//根组件 app.vue中
setup(){
    const width=document.documentElement.clientWidth
    const asideVisible= ref(width<500?false:true)
    provide('abc',asideVisible)
  }
//子组件1中使用
setup(){
        const width=document.documentElement.clientWidth
        const asideVisible=inject<Ref<boolean>>('abc')
        router.afterEach(()=>{
            // console.log('路由切换了')
            if(width>500){
                asideVisible.value=true
                return
            }
            asideVisible.value=false
        })
        return{ asideVisible}
    }
//子组件2中使用
setup(){
        const asideVisible=inject<Ref<boolean>>('abc')
        const toggleVisible=()=>{
            //console.log(asideVisible.value)
            asideVisible.value=!asideVisible.value
        }
        return{ toggleVisible}
    }

provide/inject 对比vuex:Vuex 中的全局状态的每次修改是可以追踪回溯的,而 provide/inject 中变量的修改是无法控制的,换句话说,你不知道是哪个组件修改了这个全局状态。所以: provide/inject 最好用来编写组件(造轮子),其它时候特别是多人合作时都用vuex

相关文章

  • vue中的组件通信

    一、组件通信(组件传值) 1.1父子组件通信 1.2子父组件通信 1.3非父子组件通信(兄弟组件通信)

  • 组件通信

    组件通信分为几种: 父组件给子组件通信 子组件给父组件通信 兄弟组件通信 1.父组件给子组件通信 法一...

  • 组件通信

    组件关系 组件关系可以分为父子组件通信、兄弟组件通信、跨级组件通信。 父子组件通信 1. 子组件使用 $emit(...

  • react之组件通信

    需要组件之进行通信的几种情况: 父组件向子组件通信 子组件向父组件通信 跨级组件通信 没有嵌套关系组件之间的通信 ...

  • React组件通信的几种方式

    需要组件之进行通信的几种情况 父组件向子组件通信 子组件向父组件通信 跨级组件通信 没有嵌套关系组件之间的通信 1...

  • React中组件通信的几种方式

    需要组件之进行通信的几种情况 父组件向子组件通信 子组件向父组件通信 跨级组件通信 没有嵌套关系组件之间的通信 1...

  • React中组件通信

    需要组件之进行通信的几种情况 父组件向子组件通信 子组件向父组件通信 跨级组件通信 没有嵌套关系组件之间的通信 1...

  • 第七章 可复用性的组件详解(中)

    7.7 组件通信 组件关系可分为父子组件通信、兄弟组件通信、跨级组件通信 7.7.1 自定义事件—子组件给父组件传...

  • vue 组件通信方式 ,父子、隔代、兄弟 三类通信,六种方法

    Vue 组件间通信只要指以下 3 类通信:父子组件通信、隔代组件通信、兄弟组件通信,下面分别介绍每种通信方式且会说...

  • react 跨级组件通信

    跨级组件通信所谓跨级组件通信,就是父组件向子组件的子组件通信,向更深层的子组件通信。跨级组件通信可以采用下面两种方...

网友评论

      本文标题:组件通信

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