前提
VueJS、Composition APIともに初心者です。
Visual Studio Code+Eslint+VolarでVueJSをお勉強しています。
実現したいこと
親コンポーネントから、子コンポーネントへ任意のタイミングで初期値を渡すのですが、
子コンポーネント側では、初期値として渡されたプロパティを更に変更可能としたいです。
ただ、いわゆる双方向バインディングは行わず、
親コンポーネントからは一方的に値を渡すだけの、片方向バインディング(?)を記述したいです。
上記内容について、記述方法をご存じの方がおられましたら、
ご教授頂けないでしょうか?
該当のソースコード
親コンポーネントは、子コンポーネントを配置し、ボタンで子コンポーネントの初期値を変更可能としています
ParentComponent.vue
1<template> 2 <div> 3 <div>{{ "親モードは「" + mode + "」モードです" }}</div> 4 5 <!-- 子モードの値を変更する --> 6 <div> 7 <button @click="mode = '追加'">追加</button> 8 <button @click="mode = '編集'">編集</button> 9 <button @click="mode = '照会'">照会</button> 10 </div> 11 <!-- 親モードは変えられたくないのでv-bindで渡す --> 12 <ChildComponent :mode="mode" /> 13 </div> 14</template> 15 16<script setup lang="ts"> 17import { ref } from "vue"; 18import ChildComponent from "./ChildComponent.vue"; 19 20type Mode = "" | "追加" | "編集" | "照会"; 21 22const mode = ref<Mode>(""); 23</script>
子コンポーネントで、プロパティ「mode」をそのままv-bindへ渡すことができなかったので、
computedでリアクティブ変数を用意してみたのですが。。。
ChildComponent.vue
1<template> 2 <div v-if="mode !== ''">{{ "子モードは「 " + refMode + "」モードです" }}</div> 3 4 <!-- 自分のモードを変更する --> 5 <select v-model="refMode"> 6 <option></option> 7 <option>追加</option> 8 <option>編集</option> 9 <option>照会</option> 10 </select> 11</template> 12 13<script setup lang="ts"> 14import { computed } from "@vue/reactivity"; 15import { defineProps, PropType } from "vue"; 16type Mode = "" | "追加" | "編集" | "照会"; 17 18const props = defineProps({ 19 mode: { 20 type: String as PropType<Mode>, 21 default: "", 22 }, 23}); 24 25const refMode = computed(() => { 26 return props.mode; 27}); 28</script>
発生している問題・エラーメッセージ
上記コードでは、子コンポーネント側で値を変えようとすると以下のエラーが発生します。
reactivity.esm-bundler.js:1188 Write operation failed: computed value is readonly
computed で作成した変数はreadonlyなのですね。。。
試したこと
Writable Computedというのもあるようですが、
試したところ、エラーは発生しなくなりましたが、相変わらず子コンポーネントの値は変わりません。
ChildComponent.vue
1// const refMode = computed(() => { 2// return props.mode; 3// }); 4const refMode = computed({ 5 get() { 6 return props.mode; 7 }, 8 set() { 9 // 親コンポーネントの値は変えたくないので何もしない 10 }, 11});
そもそも、Computedで作成した変数をv-modelに渡すのがダメなのでしょうか?

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。