Vueコンポーネントがあり、ユーザーが前のコンポーネントで以前にクリックした内容に応じてデータを表示します。ユーザーが最初にクリックしたときに、「現在の」インデックスを設定します。次に、次のページには、データ配列を調べて「現在の」データを返すゲッターがあります。
リダイレクト先のコンポーネントは、編集可能なフォームです。 「現在の」データを事前入力できるようにしたいと思います。プレースホルダーとしてではなく、実際の値として、直接編集できるようにします。
問題は、ゲッターから返された値をデータ関数の値に設定して、v-modelでバインドできるようにする方法がわからないことです。
HTML
<input type="text" class="form-control" id="nickname1" v-model="name" name="name">
<input type="text" class="form-control" id="address1" placeholder="" v-model="address" name="address" >
<input type="text" class="form-control" id="city1" placeholder="" v-model="city" name="city" >
VUE
data: function() {
return {
name: this.currentArea.title,
address: this.currentArea.address,
city: this.currentArea.city,
state: this.currentArea.state
}
},
computed: {
currentArea() { return this.$store.getters.currentArea }
}
* this.currentArea.titleおよびcurrentArea.titleは機能しません。
*プレースホルダーをバインドすると、データが正しく表示されるため、getter関数はcurrentAreaを正しく返します。
data
メソッドは、初期化中に1回だけ起動されます。前計算されたプロパティが設定されます。したがって、currentArea
メソッド内からdata
を参照すると、実行時にundefined
になるため、機能しません。
this.$store.getters.currentArea
がこのコンポーネントの存続期間中に変更されることが予想されない場合は、mounted
フックでデータプロパティを1回設定するのが最も簡単です。
data() {
return {
name: '',
address: '',
city: '',
state: ''
}
},
mounted() {
let area = this.$store.getters.currentArea;
this.name = area.name;
this.address = area.address;
this.city = area.city;
this.state = area.state;
}
または、このコンポーネントのデータプロパティが常にcurrentArea
と同じであることがわかっている場合は、data
メソッドでthis.$store.getters.currentArea
を直接返すことができます。
data() {
return this.$store.getters.currentArea;
}
@thanksd:ご回答ありがとうございます。状態がvuexに保存され、一時的に不完全な状態でコンポーネントに送信され、フェッチによって更新されるシナリオに取り組んでいます。また、フォームで編集できる必要があります。
私の解決策は、vuexのゲッターで州の一部をエクスポートすることでした。
getters: {
getItemDetail: (state, getters) => (id) => {
let item = state.openedItems.items.find(i => i.id === id);
return item ? item.data : null;
}
}
データ、計算されたプロパティ、および監視プロパティを組み合わせてコンポーネントで使用する(そして、lodashを使用してオブジェクトを複製する):
data () {
return {
itemDetail: null
};
},
computed: {
itemData () {
return this.$store.getters.getItemDetail(this.item.id);
}
},
watch: {
itemData (n, o) {
this.itemDetail = _.cloneDeep(n);
}
}
最後に、入力を「itemDetail」にバインドします(私の例では、要素スイッチを使用します)。
<el-switch v-model="itemDetail.property"></el-switch>
私には(しかし、私はVueにまったく慣れていません)、それは良い妥協案のように思えます。