gpt4 book ai didi

javascript - VueJS 从根 Vue 实例中的组件访问数据

转载 作者:搜寻专家 更新时间:2023-10-30 23:00:09 25 4
gpt4 key购买 nike

我正在尝试访问我的根 Vue 实例中的组件数据。我想要完成的是,您单击一个按钮,然后出现一组输入。每组输入在 localStorage 中都是它自己的对象,具有键 id、bags 和 amount。当我更新一组输入时,它们的值应该在 localStorage 中更新。我无法弄清楚如何访问我的组件的袋子和数量数据。我认为我应该使用的是 Prop ,因为那是我在 React 中使用的。但是,我还不太习惯在 Vue 中使用它们。

这是我目前所拥有的:

var STORAGE_KEY = "orders";

var orderStorage = {
fetch: function() {
var orders = JSON.parse(localStorage.getItem(STORAGE_KEY) || "[]");
orders.forEach(function(order, index) {
order.id = index;
});
orderStorage.uid = orders.length;
return orders;
},
save: function(orders) {
localStorage.setItem(STORAGE_KEY, JSON.stringify(orders));
}
};

组件

Vue.component('order', {
template: `
<div>
<select v-model="selected">
<option v-for="option in options" v-bind:value="option.value">
{{ option.text }}
</option>
</select>
<input class="input" id="bags" v-model="bags" type="number" placeholder="Bags">
<input class="input" id="amount" v-model="amount" type="number" placeholder="Amount">
<button @click="$emit('remove')">Remove</button>
</div>
`,
props: {
bags: this.bags, // I must be doing this wrong
amount: this.amount
},
data() {
return {
bags: null,
amount: null,
selected: null,
options: [{
text: "Product (25kg)",
value: 25
}, {
text: "Product (50kg)",
value: 50
}, {
text: "Product (75kg)",
value: 75
}]
}
},
watch: {
bags(newValue) {
this.amount = newValue * this.selected;
},
amount(newValue) {
this.bags = newValue / this.selected;
}
}
});

根 Vue 实例

new Vue({
el: '#app',
data: {
orders: orderStorage.fetch(),
bags: null,
amount: null,
},
watch: {
orders: {
handler: function(orders) {
orderStorage.save(orders);
},
deep: true
}
},
methods: {
addProduct: function() {
this.orders.push({
id: orderStorage.uid++,
bags: this.bags, // component.bags ?
amount: this.amount// component.amount?
});
console.log(localStorage);
}
}
});

HTML

<div id="app">
<button @click="addProduct">Add</button>

<div class="orders">
<order v-for="(order, index) in orders" :id="index" :key="order" @remove="orders.splice(index, 1)" :bags="bags" :amount="amount"></order>
</div>
</div>

示例:https://codepen.io/anon/pen/YVwxpz?editors=1010

最佳答案

通常,您不想进入组件以获取其数据。您希望组件 $emit 它。 Vue 通常是 props down, events up .

我已经修改了您的订单组件以支持 v-model。这允许对组件的更改自动反射(reflect)在父级中。

Vue.component('order', {
props:["value"],
template: `
<div>
<select v-model="order.value">
<option v-for="option in options" v-bind:value="option.value">
{{ option.text }}
</option>
</select>
<input class="input" id="bags" v-model="order.bags" type="number" @input="onBags" placeholder="Bags">
<input class="input" id="amount" v-model="order.volume" type="number" @input="onVolume" placeholder="Amount">
<button @click="$emit('remove')">Remove</button>
</div>
`,
data() {
return {
options: [{
text: "Product (25kg)",
value: 25
}, {
text: "Product (50kg)",
value: 50
}, {
text: "Product (75kg)",
value: 75
}],
order: this.value
}
},
methods: {
onBags() {
this.order.volume = this.order.bags * this.order.value;
this.$emit("input", this.order)
},
onVolume() {
this.order.bags = this.order.volume / this.order.value;
this.$emit("input", this.order)
}
}
})

new Vue({
el: '#app',
data: {
orders: orderStorage.fetch(),
},
watch: {
orders: {
handler: orders => orderStorage.save(orders),
deep: true
}
},
methods: {
addProduct: function(order) {
this.orders.push({
id: orderStorage.uid++,
bags: 0,
volume: 0,
value: 25
});
}
}
});

这样做,您不必传递bagsamount,您只需传递订单即可。然后,当订单发生变化时,将发出修改后的订单。

一个工作示例是 here .

此外,我将 value 属性添加到您的 order 对象。如果不保存它,则无法正确计算袋子和体积的变化。

关于javascript - VueJS 从根 Vue 实例中的组件访问数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43500783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com