【问题标题】:Unique id for each instance of component每个组件实例的唯一 ID
【发布时间】:2018-11-07 11:57:59
【问题描述】:

我在一个页面上有两个相同的表单,我希望将其抽象为自己的组件。但是我需要为每个表单/组件设置不同的 id,因为有 jquery 可以获取 textarea 的值并且内容不同。这样做的正确方法是什么?我可以在创建组件的新实例时附加 id 吗?

Form.vue:

          <form
            @submit.stop.prevent="onFeedbackFormSubmit(activity)"
            id="new_feedback_form">
            <div>
              <div class="textarea-container">
                <textarea
                  placeholder="Leave some feedback"
                  @keyup="onFeedbackFormSubmit(activity)"
                  v-model="feedback"
                  name="entry[feedback]">
                </textarea>
              </div>
            </div>
          </form>

form.js:

  submitForm(activity) {
    let $form = $("#new_feedback_form");
    let data = $form.serialize();
    let path = `/portfolio/${activity.record.id}`;

    // api patch request
    this.apiPatch({ data: data, path: path })
      .then(({ data }, status, xhr) => {
        this.$store.commit("current/OVERWRITE_RECORD", {
          type: "activity",
          childAttr: "feedback",
          data: data.feedback
        });
      })
      .catch(e => {
        this.generateError(e);
      });
  },

Main.vue:

<Form id="form1"></Form>
<Form id="form2"></Form>

这可能(或正确)吗?

【问题讨论】:

  • 让我看看你使用这个id的jquery代码,也许你不需要id,你只需要一个dom元素
  • @jacky 我已经添加了上面的 jquery 代码。我想要做的是获取表单中的值以发出补丁请求。如果我在同一页面上有 2 个 Form 组件实例,它们会“冲突”吗?现在,如果我在 Main.vue 的组件上添加 id,我无法获取 textarea 中的值

标签: jquery vue.js vuejs2 vue-component


【解决方案1】:

Vue document

虽然明确定义的道具是传递信息的首选 对于子组件,组件库的作者不能总是 预见可能使用它们的组件的上下文。那是 为什么组件可以接受任意属性,这些属性被添加到 组件的根元素。

Form.vue 组件中不需要声明 id 属性

但是如果你想使用 id 作为属性并引用 is 为 this.id,你应该将 id 声明为 props

Form.vue

<form :id="id"> <!--  don't pass id here -->
</form>

<script>
export default {
  props: ['id'] // we need to declare id here
}
</script>

以及何时提交表单

submitForm(activity) {
  let $form = $("#" + this.id);
}

Main.vue

<Form id="form1"></Form>
<Form id="form2"></Form>

【讨论】:

  • 可以使用非prop属性在父级定义ID...但是OP仍然需要知道他们的jQuery选择器中的ID。
  • 在组件中,你可以将id声明为props,然后你可以将其引用为this.id
  • 我很高兴您能找到适合此 OP 要求的解决方案。您应该相应地修改您的答案,以便正确解决 OP 的目标。
【解决方案2】:

你可以使用 ref 属性:

<form ref="form">
...
</form>

jQuery 代码:

$(this.$refs.form).serialize();

但是,为什么不使用 v-model 来获取 Vue 中的值呢?

【讨论】:

  • 这样就不用担心冲突了
  • 是的,你是对的,我也可以使用 v-model,因为组件的每个实例不会有相同的表单值。
猜你喜欢
  • 2017-09-30
  • 2016-04-29
  • 2019-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
  • 2012-08-28
相关资源
最近更新 更多