中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

利用vue實現組建通信的方式

發布時間:2021-09-17 20:16:06 來源:億速云 閱讀:169 作者:chen 欄目:開發技術

本篇內容主要講解“利用vue實現組建通信的方式”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“利用vue實現組建通信的方式”吧!

目錄
  • 一、組件通信

    • 1、props 父組件--->子組件通信

    • 2、$emit 子組件--->父組件傳遞

    • 3、bus(事件總線) 兄弟組件通信

    • 4、$parent、$children 直接訪問組件實例

    • 5、$refs

    • 6、provide/inject(提供/注入) 多組件或深層次組件通信

    • 7、slot(slot-scope作用域插槽) 子元素-->父元素(類似于通信)

    • 8、vuex狀態管理

一、組件通信

1、props 父組件--->子組件通信

  • 父組件---屬性的方式傳值給子組件

  • 子組件---props方式接收數據

<Son :datas="fData"></Son>

<script>
import Son from '@/components/son'
  export default{
    name:'Father',
    components:{Son},
    data(){
      return{
        fData:'我是父組件向子組件傳遞的值-props方式'
      }
    }
  }
</script>

子組件props接受的參數名稱,要與父組件傳遞時定義的屬性名一致

<template>
  <div>我是父組件的數據:{{fData}}</div>
  <div @click=changeData>我是父組件傳遞修改后的數據:{{mydata}}</div>
</template>
<script>
  export default{
    name:'Son',
    props:{
      fData:{
        type:String,
        default:''
      }
    }
    data(){
      mydata:this.fatherData
    },
    methods:{
     changeData(){
        this.mydata += '改變數據'
      }
    },
  }
</script>

注意:

  • 子組件不能夠直接去修改父組件傳遞的值修改的:因為Vue的單向數據流機制,如果直接修改那父組件的值就被“污染”了。(props是單向綁定的(只讀屬性):當父組件的屬性變化時,將傳導給子組件,但是反過來不會)

報錯信息大概是:vue使用prop通信出錯:Avoid mutating a prop directly since the value will be overwritten whenever the parent

  • 解決方案:可以在子組件內定義一個變量mydata去接收fData數據

  • 參數傳遞類型不確定是可以這么寫

props:{
    fData:{
        type:[String,Number],
        default:''
    }
}

2、$emit 子組件--->父組件傳遞

  • 子組件綁定自定義事件

  • $emit()第一個參數為:自定義的事件名稱,第二個參數為:需要傳遞的數據

  • 使用 $emit() 觸發更改數據子組件

<el-button @click="handleEmit">改變父組件</el-button>

<script>
 export default{
   name:'Son',
   methods:{
     handleEmit(){
       this.$emit('triggerEmit','子組件的數據')
     }
   }
 }
</script>

父組件(子組件發送的事件名稱,要和父組件接受的事件名稱一致)

<Son @triggerEmit="changeData"></Son>

<script>
 import Son from '@/components/son'
 export default{
   name:'Father',
   components:{Son},
   methods:{
     changeData(name){
       console.log(name) // => 我是來自子組件的數據
     }
   }
 }
</script>

$emit與props結合 兄弟組件傳值

  • 父組件引入兩個子組件

  • 父組件充當一個橋梁作用父組件

<childA :myName="name"></ChildA>
<ChildB :myName="name" @changeName="editName"></ChildB>  
    
export default{
  data() {
    return {
      name: '數據你好'
    }
  },
  methods: {
    editName(name){
      this.name = name
    }
  }
}

子組件B改變,接收數據

<p>姓名:{{ myName }}</p>
<button @click="changeName">修改姓名</button>
    
<script>
export default{
  props: {
    myName:String
  },
  methods: {
    changeName() {
      this.$emit('changeName', '新數據名稱')
    }
}
}
</script>

子組件A接收數據

<p>姓名:{{ newName }}</p>
    
<script>
export default{
  props: {
    myName:String
  }
}
</script>

3、bus(事件總線) 兄弟組件通信

非父子組件或更多層級間組件間傳值,在Vue中通過單獨的事件中心來管理組件間的傳值

  • 創建一個公共的bus.js文件

  • 暴露出Vue實例

  • 傳遞數據方,通過一個事件觸發bus.$emit(方法名,傳遞的數據)

  • 接收數據方,在生命周期函數中,通過bus.$on(方法名,[params])來監聽

  • 銷毀事件,在接受數據方,通過bus.$off(方法名)銷毀之后無法監聽數據

import Vue from "vue"
const bus=new Vue()
export default bus

需要改變數據的組件中定義調用

<template>
  <div>
    <div>我是通信組件A</div>
    <button @click="changeName">修改姓名</button>
  </div>
</template>

<script>
import bus from "@/utils/Bus.js";
export default {
  components: {},
  data() {
    return {};
  },
  mounted() {
    console.log(bus);
  },
  methods: {
    changeName() {
      bus.$emit("editName", "數據集!");
    },
  },
};
</script>

<style lang='scss' scoped>
</style>

另外一個組件中同樣引入bus.js文件,通過$on監聽事件回調

<template>
  <div>
  <span>名稱:{{name}}</span>
    <div>我是通信組件B</div>
  </div>
</template>

<script>
import  bus  from "@/utils/Bus.js";
export default {
  components: {},
  data() {
    return {name};
  },
  mounted() {
    bus.$on("editName", (name) => {
        this.name=name
      console.log(name); // 
    });
  },
  methods: {},
};
</script>

<style lang='scss' scoped>
</style>

4、$parent、$children 直接訪問組件實例

  • 子組件通過---> $parent 獲得父組件實例

  • 父組件通過---> $children 獲得子組件實例數組

子組件---this.$parent可以獲取到父組件的方法、data的數據等,并可以直接使用和執行

<template>
  <div>我是子組件</div>
</template>

<script>
export default{
  name:"Son",
  data(){
    return{
      sonTitle: '我是子組件的數據'
    }
  },
  methods:{
    sonHandle(){
      console.log('我是子組件的方法')
    }
  },
  created(){
    console.log(this.$parent)
    console.log(this.$parent.fatherTitle) // => 我是父組件的數據
    this.$parent.fantherHandle() // => 我是父組件的方法
  }
}
</script>

父組件 --- 獲取子組件實例的,并且獲取的實例是一個數組形式,this.$children[0]才可以獲取某個組件實例,并調用組件方法和數據

<template>
  <div>
    <Son>我是父組件</Son>
  </div>
</template>

<script>
import Son from './son.vue'

export default{
  name: 'father',
  components:{
    Son
  },
  data(){
    return{
      fatherTitle: '我是父組件的數據'
    }
  },
  methods:{
    fantherHandle(){
      console.log('我是父組件的方法')
    }
  },
  mounted(){
    console.log(this.$children)
    console.log(this.$children[0].sonTitle) // => 我是子組件的數據
    this.$children[0].sonHandle() // => 我是子組件的方法
  }
}
</script>

5、$refs

ref被用來給元素或子組件注冊引用信息。引用信息將會注冊在父組件的 $refs 對象上。

父組件使用 $refs 獲得組件實例

<template>
  <div>
    <Son ref="son"></Son>
  </div>
</template>

<script>
import Son from './son.vue'

export default{
  name: 'father',
  components:{
    Son
  },
  mounted(){
    console.log(this.$refs.son) /*組件實例*/
  }
}
</script>

6、provide/inject(提供/注入) 多組件或深層次組件通信

provide/inject詳解

  • 父組件使用 provide 注入數據

  • 子組件使用 inject 使用數據

/*父組件*/
export default{
 provide: {
   return{
     provideName: '販賣前端仔'
   }
 }
}

至此provideName這個變量可以提供給它其下的所有子組件,包括曾孫、孫子組件等,只需要使用 inject 就能獲取數據

/*子組件*/
export default{
  inject: ['provideName'],
  created () {
    console.log(this.provideName) // => "販賣前端仔"
  }
}
  • 父組件不需要知道哪個組件使用它提供出去的數據

  • 子附件不需要知道這個數據從哪里來

7、slot(slot-scope作用域插槽) 子元素-->父元素(類似于通信)

  • 用作一個 (能被傳遞數據的)可重用模板,來代替已經渲染好的元素

  • 在子組件中,只需將數據傳遞到插槽,就像你將 prop 傳遞給組件一樣

  • 注意:父級插槽接收內容是最外側元素 ,必須要有屬性slot-scope子元素

<template>
  <div>
    <div class="isSon">
        <slot :info='arrList'></slot>
    </div>
  </div>
</template>

<script>
export default {
  components: {},
  data() {
    return {arrList:[1,'aa','張三']};
  },
  mounted() {
  },
  methods: {
    
  },
};
</script>

父元素

<template>
<div>
    <SonG>
        <span slot-scope="props">
            <ul>
                aa
                <li v-for="item in props.info" :key="item">
                    {{item}}
                </li>
            </ul>
        </span>
    </SonG>
</div>
</template>

<script>

import SonG from '../components/SonG.vue'
export default {
   components:{
       SonG
   },
   data () {
       return {
       }
   }
}
</script>

8、vuex狀態管理

  • 相當于一個公共數據的倉庫

  • 提供一些方法管理倉庫數據

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
  }
})

到此,相信大家對“利用vue實現組建通信的方式”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

vue
AI

广东省| 大连市| 桓仁| 上虞市| 宁德市| 涿鹿县| 城步| 利辛县| 桃园县| 广丰县| 渭南市| 丹阳市| 天门市| 台安县| 古丈县| 石泉县| 阜新| 灵台县| 门头沟区| 宜兴市| 高淳县| 房山区| 新河县| 商都县| 阿克陶县| 峨山| 当雄县| 澄迈县| 五家渠市| 墨脱县| 长岛县| 富锦市| 贵德县| 名山县| 盘锦市| 中卫市| 宁津县| 收藏| 上栗县| 武宣县| 静海县|