首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用嵌套组件vuejs的最佳实践提交表单

使用嵌套组件vuejs的最佳实践提交表单
EN

Stack Overflow用户
提问于 2020-11-12 20:46:28
回答 1查看 1.1K关注 0票数 0

我在VueJs做一个电话招标项目。

我有一个页面来创建或更新呼叫招标。要做到这一点,我有一个表格:

  1. 经典形式输入
  2. 一个带有调用招标行的表(参见4),我可以添加带有产品搜索组件的行(参见3)

我想知道向我的api发送一个新的调用招标的实际做法是什么?

谢谢你的答复。瓦伦丁

EN

回答 1

Stack Overflow用户

发布于 2020-11-12 21:42:15

你不需要vuex

  • 您的整个状态必须驻留在1
  • 您的状态必须通过向下通过道具传递给子组件。
  • 您的状态更新必须通过传递给父组件(通过事件 )。
  • 您不需要将搜索值的更新传递给1,因为只有2只关心它。

请注意,V-模型指令同时执行这两个操作,因为

代码语言:javascript
复制
<Child v-model="x"/>

的别名

代码语言:javascript
复制
<Child :value="x" @input="x = $event"/>

总而言之,应该类似于:

代码语言:javascript
复制
Vue.config.productionTip = false;

const Three = {
  template: `<input :value="search" @input="$emit('input', $event.target.value)" placeholder="search">`,
  data() {
    return {
      search: '',
    }
  }
};

const Four = {
  template: `
    <div>
      <div v-for="product of value">
        <template v-if="product.name.includes(search)">
          {{ product.name }}
          <input type="checkbox" v-model="product.chosen">
          <input type="number" v-model="product.quantity">
        </template>
      </div>
    </div>
  `,
  props: ['search', 'value'],
};

const Two = {
  template: `
    <div>
      <Three v-model="search"/>
      <Four v-model="value.products" :search="search"/>
    </div>
  `,
  components: { Three, Four },
  props: ['value'],
  data() {
    return {
      search: '',
    };
  },
};

const One = {
  template: `
    <div>
      <input placeholder="title" v-model="value.title">
      <input type="date" v-model="value.date">
      <textarea placeholder="comment" v-model="value.comment"></textarea>
      <Two v-model="value"/>
      <hr>
      <pre>form value is currently {{ value }}</pre>
    </div>
  `,
  components: { Two },
  data() {
    return {
      value: {
        title: '',
        date: undefined,
        comment: '',
        products: [
          { name: 'screwdriver', chosen: false, quantity: 0 },
          { name: 'lawnmover', chosen: false, quantity: 0 },
          { name: 'car', chosen: false, quantity: 0 },
        ],
      },
    };
  },
};

new Vue({
  el: '#app',
  render: (h) => h(One),
});
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id="app"></div>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64811488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档