亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Vue中組件的傳值方式詳解

 更新時間:2023年08月17日 10:04:05   作者:飄飄~  
這篇文章主要介紹了Vue中組件的傳值方式詳解,Vue中最常見的組件之間的通信方式有12種,今天我們會詳細講解父傳子props方式和子傳父emit以及非父子組件傳值,需要的朋友可以參考下

前言

Vue中最常見的組件之間的通信方式有12種,分別為:props、$emit、sync、v-model、ref、$children / $parent、$attrs / $listeners、provide / inject、EventBus、 Vuex、 $root、 slot。

今天我們會詳細講解父傳子props方式和子傳父¥emit以及非父子組件傳值。

一、父傳子

props聲明:

父傳子的實現方式就是通過props屬性,子組件通過props屬性接收從父組件傳過來的值,而父組件傳值的時候使用 v-bind 將子組件中預留的變量名綁定為data里面的數據即可

定義方式:

字符串:

export default {
  props: ['foo'],
  created() {
    // props 會暴露到 `this` 上
    console.log(this.foo)
  }
}

對象方式:

export default {
  props: {
    title: String,
    likes: Number
  }
}

舉例:

父組件:

<template>
  <div id="app">
    <!--App props 配置方式    -->
    <student id="002" name="李四" sex="男" age="18"></student>
    <student id="003" name="王五" sex="女"></student>
  </div>
</template>
<script>
import student from "@/components/Student";
export default {
  name: 'App',
  components: {
    student
  }
}
</script>

子組件:

<template>
  <div>
    <h2 >學生ID:{{ id }}</h2>
    <h2>學生姓名:{{ name }}</h2>
    <h2>學生性別:{{ sex }}</h2>
    <h2>學生年齡:{{ age }}</h2>
  </div>
</template>
<script>
export default {
  // eslint-disable-next-line vue/multi-word-component-names
  name: "student",
  data() {
    return {}
  }, 
  // 聲明  接收app傳遞過來的數據
  props:['id','name','sex','age']
  /*methods:{
    up(){
      this.$props.name = '阿薩德';
    }
  },*/
  // 接收數據的時候限制數據的類型
  // props: {
  //   id: String,
  //   name: String,
  //   sex: String,
  //   age: Number
  // }
  // props:{
  //     id: {
  //       type:String,
  //       required:true
  //     },
  //     name: {
  //       type:String,
  //       required:true
  //     },
  //     sex: {
  //       type:String,
  //       required:true
  //     },
  //     age: {
  //       type:String,  // 類型
  //       default:'18', // 默認值
  //       required:false, // 必要的  true  false
  //       validator: function (value) { //驗證數據
  //         return value >= 1;
  //       }
  //     }
  //
  // }
}
</script>
<style scoped>
</style>

效果圖:

原理:所有的 props 都遵循著單向綁定原則,props 因父組件的更新而變化,自然地將新的狀態(tài)向下流往子組件,而不會逆向傳遞。

這避免了子組件意外修改父組件的狀態(tài)的情況,不然應用的數據流將很容易變得混亂而難以理解。

另外,每次父組件更新后,所有的子組件中的 props 都會被更新到最新值。(子組件中不能更待props值,會出現報錯!)

二、子傳父

父組件:

<template>
  <div>
    <!--  通過父組件 給子組件綁定一個自定事件 實現子組件給父組件 -->
    <!-- ****** 傳遞數據 -->
    <Student @zhangsan="getStudentName"></Student>
    <hr/>
    <Student ref="student"></Student>
  </div>
</template>
<script>
import Student from "@/components/Student";
export default {
  name: 'App',
  data() {
    return {}
  }, components: {
    Student
  }, methods: {
    getStudentName(name) {
      console.log("獲取到了學生的的信息" + name)
    }
  },mounted() {
    /*  $on(eventName) 監(jiān)聽事件 */
    /* Vue 為每個窗口 都提供了一個 事件接口  Events interface */
    this.$refs.student.$on('zhangsan',this.getStudentName)
  }
}
</script>

子組件:

<template>
  <div>
    <h2>學生姓名:{{ name }} </h2>
    <h2>學生性別:{{ sex }} </h2>
    <button @click="sendStudentName">點我傳遞學生信息</button>
  </div>
</template>
<script>
export default {
  // eslint-disable-next-line vue/multi-word-component-names
  name: "Student",
  data() {
    return {
      name: '張三',
      sex: '男'
    }
  },methods:{
    sendStudentName(){
      //  $emit 觸發(fā)事件   >>> $emit(eventName)
      this.$emit('zhangsan',this.name);
      // this.$emit('zhangsan',this.name,.,.,.,.,.,.);
    }
  }
}
</script>
<style scoped>
</style>

效果圖:

三、非父子組件

兄弟組件之間的數據傳遞,通過 eventBus 來做中間的橋梁,傳輸方通過 Bus.$emit('自定義事件名', 數據)傳數據,接收方通過 Bus.$on('自定義事件名', callback)接收數據,兩者之間的自定義屬性名保持一致

傳值思想其實是一致的,先使用$on定義一個全局事件,后面寫個回調函數,觸發(fā)這個事件執(zhí)行的方法,可以接參數bus.$on('msg',val=>{ }),msg就是全局事件,然后在想要獲取這個全局事件里面的值就調用他,不過這時候不是 this.emit 而是 bus . emit 而是 bus.emit而是bus.emit

A組件:

<template>
  <div>
    A組件:
    <span>{{elementValue}}</span>
    <input type="button" value="點擊觸發(fā)" @click="elementByValue">
  </div>
</template>
<script>
  // 引入公共的bug,來做為中間傳達的工具
  import Bus from './bus.js'
  export default {
    data () {
      return {
        elementValue: 4
      }
    },
    methods: {
      elementByValue: function () {
        Bus.$emit('val', this.elementValue)
      }
    }
  }
</script>

B組件:

<template>
  <div>
    B組件:
    <input type="button" value="點擊觸發(fā)" @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事件來接收參數
      Bus.$on('val', (data) => {
        console.log(data)
        vm.name = data
      })
    },
    methods: {
      getData: function () {
        this.name++
      }
    }
  }
</script>

四、其他傳值方式

組件中可以使用 $parent和 $children獲取到父組件實例和子組件實例,進而獲取數據$parent 當前組件樹的根 Vue 實例。

如果當前實例沒有父實例,此實例將會是其自己。

$children 當前實例的直接子組件。

需要注意 $children 并不保證順序,也不是響應式的。如果你發(fā)現自己正在嘗試使用 $children 來進行數據綁定,考慮使用一個數組配合 v-for 來生成子組件,并且使用 Array 作為真正的來源。

總結:

父組件通過 prop 給子組件下發(fā)數據,子組件通過事件給父組件發(fā)送消息

最后的最后賦一張借鑒來的圖供大家快速記憶:

到此這篇關于Vue中組件的傳值方式詳解的文章就介紹到這了,更多相關Vue組件傳值內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Vue3項目實現前端導出Excel的示例代碼

    Vue3項目實現前端導出Excel的示例代碼

    這篇文章主要介紹了Vue3項目實現前端導出Excel的示例,在vue3的項目中導出Excel表格的功能,可以借助xlsx庫來實現,下面是詳細的操作步驟,需要的朋友可以參考下
    2025-01-01
  • Element-plus使用中遇到的問題小結

    Element-plus使用中遇到的問題小結

    表格數據是websocket通信獲取的數據,首次獲取20條數據,以后新增訂閱獲取一條,新增一條則向上滑動顯示最新數據,本文給大家介紹Element-plus使用中遇到的問題小結,感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • Vue3+vueuse實現放大鏡示例詳解

    Vue3+vueuse實現放大鏡示例詳解

    這篇文章主要為大家介紹了Vue3+vueuse實現放大鏡示例過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Vue中$emit調用父組件異步方法模擬.then實現方式

    Vue中$emit調用父組件異步方法模擬.then實現方式

    這篇文章主要介紹了Vue中$emit調用父組件異步方法模擬.then實現方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • 如何理解Vue前后端數據交互與顯示

    如何理解Vue前后端數據交互與顯示

    這篇文章主要介紹了如何理解Vue前后端數據交互與顯示,對Vue感興趣的同學,可以參考下
    2021-05-05
  • vue動態(tài)綁定圖標的完整步驟

    vue動態(tài)綁定圖標的完整步驟

    動態(tài)綁定是我們日常開發(fā)中經常遇到的一個需求,下面這篇文章主要給大家介紹了關于vue動態(tài)綁定圖標的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-05-05
  • Vue中的局部組件介紹

    Vue中的局部組件介紹

    這篇文章主要介紹了Vue中的局部組件,文章圍繞Vue局部組件得相關資料展開內容,需要的的小孩伙伴請參考下面文章的具體介紹,希望對你有所幫助
    2021-12-12
  • vue.js實現刷新當前頁面的方法教程

    vue.js實現刷新當前頁面的方法教程

    這篇文章主要給大家介紹了關于vue.js實現刷新當前頁面的方法教程,文中給出了詳細的示例代碼供大家參考學習,對大家具有一定的參考學習價值,需要的朋友們下面跟著小編一起來學習學習吧。
    2017-07-07
  • Vue-less的使用和deep深度選擇器詳解

    Vue-less的使用和deep深度選擇器詳解

    這篇文章主要介紹了Vue-less的使用和deep深度選擇器,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • vue中的插槽詳解

    vue中的插槽詳解

    這篇文章主要介紹了Vue中的插槽,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-10-10

最新評論