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

标签 javascript vue.js local-storage

我正在尝试访问我的根 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/

相关文章:

php - 事件目录下具有基于信任的身份验证的 JavaScript 小部件

vue.js - 如何在 Nuxt SSR 模式下更改页面的 URL 而无需重新加载整个页面?

javascript - 如何在 Javascript 中不使用 JSON 将项目名称和分数保存到 localStorage

html - 将海量数据存储在localStorage中

javascript - 检查本地存储值是否存在

javascript - 为什么在尝试迭代图像列表时不会删除指定的图像?

javascript - 变量未定义错误(即使console.log显示变量)

javascript - Jquery 不支持按钮的背景更改?

javascript - .js 文件中的 VueJS "new Vue()"不工作

vue.js - 如何将插槽和插槽范围移动到 vue 3 v-slot 规则