1. 程式人生 > 實用技巧 >vue 資料通訊總結

vue 資料通訊總結

資料單向流動prop react也是一樣prop

1.prop / $emit (常用父子元件傳遞)

//父傳給子
<child :title="title"></child>

//子通過props接收
export default {
  name: 'demo',
  data: function() {},
  props: {
    title: {
      type: String
    }
  },
};
//子傳給父

methods: {
    childTitle() {
      this.$emit('changeTitle', `我給父元件的第${this.key}次`);      
    }
  }
};


//父接收

<child @changeTitle="parentTitle"></child>  //自定義事件

2. $emit / $on(任意元件間傳遞)

建立個空的元件,來作eventbus用來觸發及監聽事件

// 父元件
<template>
  <div class="container">
    <child1 :Event="Event"></child1>
    <child2 :Event="Event"></child2>
    <child3 :Event="Event"></child3>
  </div>
</template>

<script>

const
Event = new vue(); //***重點 export default { name: "demo", data: function() { return { Event: Event }; }, components: { Child1, Child2, Child3 }, }; </script> // 子元件1 <template> <div class="center"> <button @click="send">我給3元件賦值</button> </div> </template> <script> export default{ name: "demo1", data() { return { name: "政採雲" }; }, props: { Event }, methods: { send() { this.Event.$emit("message-a", this.name); //***觸發事件 } } }; </script> // 子元件2 <template> <div class="center"> <button @click="send">我給3元件賦值</button> </div> </template> <script> /* eslint-disable */ export default { name: "demo2", data() { return { age: "3" }; }, props: { Event }, methods: { send() { this.Event.$emit("message-b", this.age); //***觸發事件 } } }; </script> // 子元件3 <template> <div class="center">我的名字是{{name}},今年{{age}}歲</div> </template> <script> export default{ name: 'demo3', data() { return { name: '', age: '' }; }, props: { Event }, mounted() { this.Event.$on('message-a', name => { //**** 重點: 監聽事件message-a this.name = name; }); this.Event.$on('message-b', age => { //**** 重點: 監聽事件message-b this.age = age; }); }, }; </script>

可以任意傳。 思想類似傳物件給子元件,在子元件裡修改物件的屬性 父元件裡的跟著響應

3.vuex 牛刀

集中式儲存管理應用的所有元件的狀態。

Vuex 實現了一個單項資料流,通過建立一個全域性的 State 資料,元件想要修改 State 資料只能通過 Mutation 來進行,頁面上的操作想要修改 State 資料時,需要通過 Dispatch (觸發 Action ),而 Action 也不能直接操作資料,還需要通過 Mutation 來修改 State 中資料,最後根據 State 中資料的變化,來渲染頁面

const store = new Vuex.Store({
  state: {
    count: 1
  },
  mutations: {
    increment(state) {
      state.count++;
    },
    reduce(state) {
      state.count--;
    }
  },
  actions: {
    actIncrement({ commit }) {
      commit('increment');
    },
    actReduce({ commit }) {
      commit('reduce');
    }
  },
  getters: {
    doubleCount: state => state.count*2
  }
});

//vue例項
export default {
  name: "demo",
  data: function() {
    return {};
  },
  components: {},
  props: {},
  computed: {
    ...mapState(["count"]),
    ...mapGetters(["doubleCount"])
  },
  methods: {
    ...mapActions(["actIncrement", "actReduce"])
  }
};

4.$attrs / $listeners

vue2.4後的新方法,加強props。

$attrs: 包含了父作用域中不作為 Prop 被識別 (且獲取) 的特性繫結(Class 和 Style 除外)。當一個元件沒有宣告任何 Prop 時,這裡會包含所有父作用域的繫結 (Class 和 Style 除外),並且可以通過 v-bind="$attrs" 傳入內部元件——在建立高級別的元件時非常有用

$listeners: 包含了父作用域中的 (不含 .native 修飾器的) v-on 事件監聽器。它可以通過 v-on="$listeners" 傳入內部元件

//父元件
 <button style="backgroundColor:lightgray" @click="reduce">減dd</button>
 <child1 :aa="aa" :bb="bb" :cc="cc" :dd="dd" @reduce="reduce"></child1>


// 子元件1
<template>
  <div>
    <div class="center">
      <p>aa:{{aa}}</p>
      <p>child1的$attrs:{{$attrs}}</p>
      <button @click="this.reduce1">元件1減dd</button>
    </div>
    <child2 v-bind="$attrs" v-on="$listeners"></child2> //寫法
  </div>
</template>

//子元件1的子元件也可以獲得子元件1的父元件的屬性和監聽  

簡單來說,$attrs 裡存放的是父元件中繫結的非 props 屬性,$listeners 裡面存放的是父元件中繫結的非原生事件。 解決一級一級prop的痛點

5.Provider / Inject 需要一起使用

vue2.2新增的API。允許一個祖先元件向其所有子孫注入一個依賴,不論元件層級多深,在其上下游關係成立的時間裡始終生效

// 父元件
<template>
  <div class="container">
    <button @click="this.changeName">我要改名字了</button>
    <p>我的名字:{{name}}</p>
    <child1></child1>
  </div>
</template>

<script>

export default {
  name: 'demo',
  data: function() {
    return {
      name: '節能'
    };
  },
  // provide() {
  //   return {
  //     name: this.name //這種繫結方式是不可響應的   !注意!  
  //   };
  // },
  provide() {
    return {
      obj: this   //繫結物件
    };
  },
  components: {
    Child1
  },
  methods: {
    changeName() {
      this.name = '節能晚上';
    }
  }
};
</script>


// 子元件
<template>
  <div>
    <div class="center">
      <!-- <p>子元件名字:{{name}}</p> -->
      <p>子元件名字:{{this.obj.name}}</p>
    </div>
    <child2></child2>
  </div>
</template>

<script>

export default {
  name: 'demo1',
  data() {
    return {};
  },
  props: {},
  // inject: ["name"],  //這種方式注入,改變了name是 非響應式的,
  inject: {             //這種注入  是響應式的。 
    obj: {  
      default: () => {
        return {};
      }
    }
  },
  components: {
    child2
  },
};
</script>


簡單來說,就是父元件通過 Provider 傳入變數,任意子孫元件通過 Inject 來拿到變數。Provide 和 Inject 繫結並不是可響應的。然而,如果你傳入了一個可監聽的物件,那麼其物件的屬性還是可響應的.這是js物件引用型別的原故

資源搜尋網站大全 https://www.renrenfan.com.cn 廣州VI設計公司https://www.houdianzi.com

6.$parent / $children & $refs

$parent / $children: 指定已建立的例項之父例項,在兩者之間建立父子關係。子例項可以用 this.$parent 訪問父例項,子例項被推入父例項的 $children 陣列中 。

$refs: 一個物件,持有註冊過 ref 特性的所有 DOM 元素和元件例項。ref 被用來給元素或子元件註冊引用資訊。引用資訊將會註冊在父元件的 $refs 物件上。如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;如果用在子元件上,引用就指向元件。