2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Vue3.2 で追加された expose のメモ

Last updated at Posted at 2021-11-24

Vue 3.2 より setup 関数の第2引数の contextexpose という関数が追加されました。

expose を使うことにより、そのコンポーネントが公開するプロパティを明示的に示すことができるようになります。

これについてのメモです。

公式ドキュメントはこちら

使い方

対象のコンポーネント

script 部分のみ抜粋

ChildComponent.vue
<script>
export default {
  name: "ChildComponent",

  setup(props, context) {
    const func = () => {
      console.log("child func");
    };

    // funcを公開
    context.expose({
      func
    })

    return {
    }
  },
};
</script>

利用する側のコンポーネント

Parent.vue
<template>
  <div>
    <ChildComponent ref="child" />

    <button @click="handleClick">click me!</button>
  </div>
</template>

<script>
import { ref } from "vue";
import ChildComponent from "./ChildComponent.vue";

export default {
  name: "Parent",
  components: {
    ChildComponent,
  },
  setup() {
    const child = ref(null);

    const handleClick = () => {
      // 公開されている関数を呼び出す
      child.value.func();
    };

    return {
      child,
      handleClick,
    };
  },
};
</script>

expose で公開された関数はchild.value.func() のような形で利用することができます。

また expose を使ったコンポーネントは
下で挙げるような return に含めるものとは異なり child.value はまた別の形のインスタンスになっているようです。(console.log(child.value) をしてみて差異を比較するとわかります。)

おわりに

これよりも前のバージョンでは

setup(props, context) {
  const func = () => {
    console.log("child func");
  };

  return {
    func
  }
},

このように setup 関数の中でreturn に含めて返すことで 同じことができましたが
テンプレートで利用しないものまで 含めるのは違和感がありました。

expose 関数を使うことで 「外部に公開するもの」「テンプレートで使うもの」を
明示的に示すことができるので このあたりの問題を解決することができるかなと思います。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?