深入瞭解Vue3組件傳值方式

今天說一下 vue3 的組件間傳值,學習過 vue2 的寶子們肯定知道,組件傳值是 vue 項目開發過程中必不可少的功能場景,在 vue2 裡面有很多傳值的方式,vue3 的傳值方式呢,在這裡稍微整理總結一下,但是不是很全,後期可能慢慢補充。

父子組件傳值 props

和 vue2 一樣,vue3 也可以使用 props 進行父組件傳值給子組件,這個就不多說瞭直接上代碼。

父組件

<template>
  <div>
    <div class="father">
      <h1>這是父組件</h1>
      <h2>父組件的名字:{{boy.name}}</h2>
    </div>
    <hello-world :msg="msg" :boy="boy" @change="btn"></hello-world>
  </div>
</template>

<script>
import HelloWorld from "./components/HelloWorld.vue";

import { ref, reactive } from "vue";

export default {
  name: "App",
  components: {
    HelloWorld
  },
  setup() {
    const boy = reactive({
      name: "我是𝒆𝒅.",
      age: 10
    });
    const msg = ref("這是一條信息");

    const btn = val => {
      console.log(val);
      alert(val);
    };

    return { boy, msg, btn };
  }
};
</script>

<style scoped>
.father {
  background-color: aquamarine;
}
</style>

子組件

<template>
  <div class="son">
    <h1>這是子組件</h1>
    <h2>這是父組件傳進的數據: {{msg}}</h2>
    <h2>這是父組件傳進的數據: {{boy.name}}</h2>
    <button @click="btn">傳給父組件數據</button>
  </div>
</template>

<script>
import { toRefs } from "vue";
export default {
  name: "HelloWorld",
  props: {
    msg: String,
    boy: Object
  },
  setup(props, { emit }) {
    console.log(props);
    const p = toRefs(props);
    const msg = p.msg;
    const boy = p.boy;

    const btn = () => {
      const news = "我是子組件傳進的值";
      emit("change", news);
    };

    return { msg, boy, btn };
  }
};
</script>

<style scoped>
.son {
  background-color: bisque;
}
</style>

保存查看效果。

上面就是 props 傳值的基本用法。

祖孫組件傳值 provide 和 inject

這個其實和 vue2 的寫法是一模一樣的。

直接上代碼!!

父組件

<template>
  <div>
    <div class="father">
      <h1>這是父組件</h1>
      <h2>名字:{{boy.name}}</h2>
      <h2>年齡:{{boy.age}}</h2>
    </div>
    <hello-world></hello-world>
  </div>
</template>

<script>
import HelloWorld from "./components/HelloWorld.vue";

import { reactive, provide } from "vue";

export default {
  name: "App",
  components: {
    HelloWorld
  },
  setup() {
    const boy = reactive({
      name: "我是𝒆𝒅.",
      age: 10
    });

    provide("boy", boy); // 往子孫組件傳值

    return { boy };
  }
};
</script>

<style scoped>
.father {
  background-color: aquamarine;
}
</style>

子組件

<template>
  <div class="son">
    <h1>這是子組件</h1>
    <h2>這是父組件傳進的數據: {{boy.name}}</h2>
    <h2>這是父組件傳進的數據: {{boy.age}}</h2>
  </div>
</template>

<script>
import { toRefs, inject } from "vue";
export default {
  name: "HelloWorld",
  setup() {
    const boy = inject("boy"); // 子孫組件接收值
    return { boy };
  }
};
</script>

<style scoped>
.son {
  background-color: bisque;
}
</style>

刷新看一下效果。

好的,我們可以看到子組件可以順利拿到父組件傳進來的數據值。

父組件中點擊按鈕向子組件傳值

就是使用 ref 來獲取dom 然後操作裡面的參數和方法。

父組件

<template>
  <div>
    <div class="father">
      <h1>這是父組件</h1>
      <h2>名字:{{boy.name}}</h2>
      <h2>年齡:{{boy.age}}</h2>
      <button @click="btn">傳值</button>
    </div>
    <hello-world ref="hello" style="color: red"></hello-world>
  </div>
</template>

<script>
import HelloWorld from "./components/HelloWorld.vue";

import { reactive, ref } from "vue";

export default {
  name: "App",
  components: {
    HelloWorld
  },
  setup() {
    const boy = reactive({
      name: "我是𝒆𝒅.",
      age: 10
    });

    const hello = ref();

    function btn() {
      hello.value.init(boy); // 調用子組件的方法,把boy對象傳進去
    }

    return { boy, btn, hello };
  }
};
</script>

<style scoped>
.father {
  background-color: aquamarine;
}
</style>

子組件

<template>
  <div class="son">
    <h1>這是子組件</h1>
    <h2>這是父組件傳進的數據: {{boy.name}}</h2>
    <h2>這是父組件傳進的數據: {{boy.age}}</h2>
  </div>
</template>

<script>
import { reactive, toRefs } from "vue";
export default {
  name: "HelloWorld",
  setup() {
    let boy = reactive({
      name: "ed.",
      age: 11
    });

    // 提供給父組件調用的方法
    const init = val => {
      boy.name = val.name;
      boy.age = val.age;
    };

    return { init, boy };
  }
};
</script>

<style scoped>
.son {
  background-color: bisque;
}
</style>

以上就是深入瞭解Vue3組件傳值方式的詳細內容,更多關於Vue3組件傳值的資料請關註WalkonNet其它相關文章!

推薦閱讀: