最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

uniapp和vue組件之間的傳值(父子傳值,兄弟傳值,跨級傳值,vuex)

 更新時間:2023年05月24日 11:22:21   作者:鐵錘妹妹@  
這篇文章主要介紹了uniapp和vue組件之間的傳值(父子傳值,兄弟傳值,跨級傳值,vuex),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

前言

在做vue項目或者uniapp開發(fā)微信小程序時,經(jīng)常會用到組件之間傳值,因此想總結(jié)記錄下。

一、父子傳值

  • 父向子傳遞:props
  • 子向父傳遞:通過 events($emit
  • 父組件想調(diào)用子組件的方法:通過 this.$refs(ref)

a)ref 用在組件可以調(diào)用組件的屬性方法

b)ref 用在標簽可以對標簽進行操作

c) ref屬性不能用在uniapp的內(nèi)置組件上面,只能用在自定義組件上面;用在內(nèi)置組件比如<view>標簽,this.$refs.xxx獲取dom是undefind

父組件調(diào)用子組件的方法

// 父組件
<template>
  <view>
    <view class="index-goods-list-con">
      <WaterfallList
        ref="waterFallCon"
        :status="waterfall.status"
        :list="waterfall.list"
        :reset="waterfall.reset"
        @clickCard="onClickCard"
        @handleGood="handleGood"
        @done="onDone"
      ></WaterfallList>
    </view>
  </view>
</template>
<script>
import WaterfallList from '@/components/waterfall/waterfall-list.vue'
export default {
  data() {
    return {}
  },
  methods: {
    handleDailyBestGood(e, good) {
      // 用$refs賦值調(diào)用子組件的handleDailyBestNum方法
      this.$refs.waterFallCon.handleDailyBestNum(good) 
    },
  },
}
</script>
<style></style>
// 子組件
<template></template>
<script>
export default {
  data() {
    return {
        renderBasic: ''    
    }
  },
  methods: {
     //父組件調(diào)用的方法
     handleDailyBestNum(good) {  
       //good 是父組件彈窗傳遞過來的值,我們可以打印看看
          console.log(good)
          this.renderBasic = good
    },
  },
}
</script>

二、兄弟傳值

借助中間代理, $emit$on

比如在uniapp項目中使用兄弟傳值,vue同理 uniapp頁面通訊官方文檔

a) 說明

b) 使用場景

在商品下單頁點擊選擇優(yōu)惠券,進入優(yōu)惠券頁面,選擇一張適合的,再返回下單頁,需要帶著優(yōu)惠券id返回,現(xiàn)在商品 提交訂單頁和優(yōu)惠券頁面是 跨頁面 的。

c) 使用方法

//優(yōu)惠券頁面
 clickCoupon (item) {
      if (this.orderSource) {
      // 觸發(fā)全局自定義事件,傳參id
        uni.$emit('updateData', item.id)  
		uni.navigateBack({
		   delta: 1
		})
      }
    },
 // 從優(yōu)惠券跳回下單頁 
 // 監(jiān)聽全局自定義事件updateData,接收參數(shù)id
    uni.$on('updateData', async function (couponId) {
      that.couponId = couponId
    })

d) 注意事項

  • uni.$emit、 uni.$on 、 uni.$once 、uni.$off 觸發(fā)的事件都是 App 全局級別的,跨任意組件,頁面,nvue,vue 等
  • 使用時,注意及時銷毀事件監(jiān)聽,比如,頁面 onLoad 里邊 uni.$on 注冊監(jiān)聽,onUnload 里邊uni.$off 移除,或者一次性的事件,直接使用 uni.$once 監(jiān)聽。
  • 注意 uni.$on 定義完成后才能接收到 uni.$emit 傳遞的數(shù)據(jù)

三、祖孫或者更深嵌套的組件間傳值: provide/inject

a) 類型

provide:Object | () => Object
inject:Array<string> | { [key: string]: string | Symbol | Object }

b) 詳細

這對選項需要一起使用,以允許一個祖先組件向其所有子孫后代注入一個依賴,不論組件層次有多深,并在其上下游關(guān)系成立的時間里始終生效。

provide 選項應(yīng)該是一個對象或返回一個對象的函數(shù)。該對象包含可注入其子孫的 property。

inject 選項應(yīng)該是: 一個字符串?dāng)?shù)組,或一個對象

提示:provide 和 inject 綁定并不是可響應(yīng)的。這是刻意為之的。然而,如果你傳入了一個可監(jiān)聽的對象,那么其對象的 property 還是可響應(yīng)的。 

c) 使用場景

如果要將祖先組件直接傳遞給孫子組件,我們要將props逐級傳遞下去:祖先組件 =》子組件 =》孫子組件,而通過provide/inject,可直接從祖先組件傳給孫子組件,即使再嵌套多層也沒關(guān)系。

 

d) 使用方法

<template>
  <div>
    <button @click="changeMsg">祖組件觸發(fā)</button>
    <h1>祖組件</h1>
    <parent></parent>
  </div>
</template>
<script>
import parent from './parent.vue';
export default {
  data(){
    return{
      obj:{
        name:'JavaScript',
      },
      developer:'布蘭登·艾奇',
      year:1995,
      update:'2021年06月',
    }
  },
  provide(){
    return {
      obj: this.obj, // 方式1.傳入一個可監(jiān)聽的對象
      developerFn:() => this.developer, // 方式2.通過 computed 來計算注入的值
      // developerFn: this.getDeveloper,  方式3.或者調(diào)用一個方法,也能實現(xiàn)響應(yīng)式 
      year: this.year, // 方式4.直接傳值
      app: this, // 方式5. 提供祖先組件的實例 缺點:實例上掛載很多沒有必要的東西 比如:props,methods。
    }
  },
  components: {
    parent,
  },
  methods:{
    getShowCartValue() {
       return this.developer
    },
    changeMsg(){
      this.obj.name = 'Vue';
      this.developer = '尤雨溪';
      this.year = 2014;
      this.update = '2021年6月7日';
    },
  },
}
</script>

子組件

<template>
  <div class="wrap">
    <h4>子組件(只做中轉(zhuǎn))</h4>
    <child></child>
  </div>
</template>
<script>
import child from './child.vue';
export default {
  components:{
    child,
  },
}
</script>

孫組件

<template>
  <div>
    <h5>孫組件</h5>
    <span>名稱:{{obj.name}}</span> |
    <span>作者:{{developer}}</span> |
    <span>誕生于:{{year}}</span> |
    <span>最后更新于:{{this.app.update}}</span>
  </div>
</template>
<script>
export default {
  computed:{
    developer(){
      return this.developerFn()
    }
  },
  inject:['obj','developerFn','year','app'],
}
</script>

未點擊按鈕,原有狀態(tài)

當(dāng)點擊按鈕觸發(fā) changeMsg 方法后,效果如下:

對比一下前后差異:無論點擊多少次,孫組件中的誕生于 year 字段永遠都是1995 并不會發(fā)生變化,通過 方式1、方式2、方式3、方式5傳值是可以響應(yīng)的。

正是官網(wǎng)所提到的:provide 和 inject 綁定并不是可響應(yīng)的。這是刻意為之的。然而,如果你傳入了一個可監(jiān)聽的對象,那么其對象的 property 還是可響應(yīng)的。

注意:

1)另外如果孫子組件更改祖先組件傳來的值,會發(fā)現(xiàn)祖先組件的值也會跟著變,所以慎用 provide / inject;

2)Vuex 和 provide/inject 最大的區(qū)別:Vuex 中的全局狀態(tài)的每次修改是可以追蹤回溯的,而 provide/inject 中變量的修改是無法控制的。換句話說,不知道是哪個組件修改了這個全局狀態(tài)。

所以對于業(yè)務(wù)龐大而復(fù)雜的,還是建議使用vuex~

四、更復(fù)雜的結(jié)構(gòu):vuex

請移步看我之前寫的關(guān)于vuex使用總結(jié)文章,學(xué)習(xí)筆記之Vuex總結(jié)(Vue狀態(tài)管理)

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Vue動態(tài)權(quán)限登錄實現(xiàn)(基于路由與角色)

    Vue動態(tài)權(quán)限登錄實現(xiàn)(基于路由與角色)

    很多應(yīng)用都會需要對不同的用戶進行權(quán)限控制,本文主要介紹了Vue動態(tài)權(quán)限登錄實現(xiàn)(基于路由與角色),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 詳解vue-admin和后端(flask)分離結(jié)合的例子

    詳解vue-admin和后端(flask)分離結(jié)合的例子

    本篇文章主要介紹了詳解vue-admin和后端(flask)分離結(jié)合的例子,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • iView UI FORM 動態(tài)添加表單項校驗規(guī)則寫法實例

    iView UI FORM 動態(tài)添加表單項校驗規(guī)則寫法實例

    這篇文章主要為大家介紹了iView UI FORM 動態(tài)添加表單項校驗規(guī)則寫法實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • vue+openlayer5獲取當(dāng)前鼠標滑過的坐標實現(xiàn)方法

    vue+openlayer5獲取當(dāng)前鼠標滑過的坐標實現(xiàn)方法

    在vue項目中怎么獲取當(dāng)前鼠標劃過的坐標呢?下面通過本文給大家分享實現(xiàn)步驟,感興趣的朋友跟隨小編一起看看吧
    2021-11-11
  • vue data中如何獲取使用store中的變量

    vue data中如何獲取使用store中的變量

    這篇文章主要介紹了vue data中如何獲取使用store中的變量,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 利用Vue+ElementUi實現(xiàn)評論功能

    利用Vue+ElementUi實現(xiàn)評論功能

    這篇文章主要介紹了如何利用Vue+ElementUi實現(xiàn)評論功能,結(jié)合實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-04-04
  • 淺談 vue 中的 watcher

    淺談 vue 中的 watcher

    這篇文章主要介紹了vue 中的 watcher的相關(guān)資料,需要的朋友可以參考下
    2017-12-12
  • vue2.0 可折疊列表 v-for循環(huán)展示的實例

    vue2.0 可折疊列表 v-for循環(huán)展示的實例

    今天小編大家分享一篇vue2.0 可折疊列表 v-for循環(huán)展示的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • 使用自動導(dǎo)入后eslint報錯eslint9的問題及解決方法

    使用自動導(dǎo)入后eslint報錯eslint9的問題及解決方法

    本文介紹了使用`pnpm create vue@latest`創(chuàng)建Vue應(yīng)用時,如何配置ESLint和Prettier,包括解決兩者沖突以及自動導(dǎo)入后Eslint報錯的問題,感興趣的朋友一起看看吧
    2025-03-03
  • vue實現(xiàn)側(cè)邊定位欄

    vue實現(xiàn)側(cè)邊定位欄

    這篇文章主要為大家詳細介紹了vue實現(xiàn)側(cè)邊定位欄,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07

最新評論

神池县| 晋州市| 怀仁县| 娱乐| 开平市| 策勒县| 洞头县| 象州县| 昌都县| 交城县| 若尔盖县| 塘沽区| 霍山县| 南平市| 大竹县| 衡山县| 平邑县| 高州市| 盐城市| 长春市| 大石桥市| 车险| 静海县| 噶尔县| 晴隆县| 北安市| 宜州市| 喀什市| 泰和县| 麻江县| 奉贤区| 山阴县| 大余县| 思茅市| 涞源县| 大关县| 南靖县| 辽阳市| 兴文县| 西乌| 兴安盟|