【问题标题】:Axios call, getting response data into select options with vueaxios 调用,使用 vue 将响应数据获取到选择选项中
【发布时间】:2019-04-11 14:40:52
【问题描述】:

我在这里要做的只是弄清楚如何将响应数据值绑定到我的多选 options 但我不知道我做错了什么。

控制台日志正确显示了我返回的结果,因此我知道它们正在被返回,但我不知道如何将它们与我的多选选项联系起来。

例如,如果我在多选中键入“Day”,我的 axios 调用会执行自动完成功能并获取匹配选项,因此我的控制台会显示:

 0:
    tag_id:  "1001"
    tag_data: "First Day"
 1:
    tag_id:   "1002"
    tag_data: "Second Day"

那么我怎样才能将这些返回值放入我的选项中?

  <div id="tagApp">
      <multiselect
      v-model="value"
      :options="options"
      :loading="loading"
      :multiple="true"
      :taggable="true"
      @search-change="val => read(val)"
      ></multiselect>
  </div>

new Vue({
      components: {
        Multiselect: window.VueMultiselect.default
      },
      el: "#tagApp",
      data() {
        return{
            value: [],
            loading: false,
            options: []
        }

      },
      methods: {
        read: function(val){
            //console.log('searched for', val);
          if (val) {
            this.loading = true;
            this.options = [];

            const self = this;
            console.log(val);

            axios.get('campaigns/search',{params: {query: val}})
                .then(function (response) {
                    self.options = response.data;
                    console.log(response.data);
            });

          } else {
            this.options = [];
          }
        }
      }
    })

【问题讨论】:

  • response.data 是什么格式的? json?
  • 对不起,是 JSON
  • 你能告诉我 multiselect 组件吗?它对它的 options 道具有什么期望?字符串列表?
  • 多选组件目前在代码中。它期待来自 JSON 对象的字符串数据,是的

标签: javascript laravel vue.js axios


【解决方案1】:

由于您使用对象作为选项,您需要将labeltrack-by 属性传递给多选组件。请参阅文档here

<multiselect
  v-model="value"
  label="tag_data"
  track-by="tag_id"
  :options="options"
  :loading="loading"
  :multiple="true"
  :taggable="true"
  @search-change="val => read(val)"
></multiselect>

【讨论】:

  • 谢谢你,我没有意识到需要这些,但这是有道理的。唯一的问题:现在看来,一旦我选择了一个标签,然后选择另一个标签就会清除所有标签。基本上制作标签认为它们都被选中。我的代码中是否清楚为什么会发生这种情况?
  • 实际上,没关系,现在可以了。但是,它不允许创建新标签
【解决方案2】:

您需要添加label 属性以及track-by 属性。在我的示例中,title 是我用作 options 的对象上的属性,因此您需要使用存在于您正在使用的数组中的属性名称为 options..

CodePen 镜像:https://codepen.io/oze4/pen/ROVqZK?editors=1010

Vue.component("multiselect", window.VueMultiselect.default);

new Vue({
  el: "#app",
  data: {
    value: [],
    options: []
  },
  mounted() {
    var self = this;
    axios
      .get("https://jsonplaceholder.typicode.com/todos?_start=1&_end=10")
      .then(response => {
        self.options = response.data;
      })
      .catch(error => {
        alert(error);
      });
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.10/vue.min.js"></script>
<script src="https://unpkg.com/vue-multiselect@2.1.0/dist/vue-multiselect.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.18.0/axios.min.js"></script>
<link rel="stylesheet" href="https://unpkg.com/vue-multiselect@2.1.0/dist/vue-multiselect.min.css">

<div id="app">
  <label class="typo__label">Simple select / dropdown</label>
  <multiselect 
    v-model="value" 
    :height="300"
    :options="options" 
    :multiple="true" 
    :close-on-select="false" 
    :clear-on-select="false" 
    :preserve-search="true" 
    placeholder="Pick some" 
    label="title" 
    track-by="title" 
    :preselect-first="false"
  >
    <template slot="selection" slot-scope="{ values, search, isOpen }"><span class="multiselect__single" v-if="values.length &amp;&amp; !isOpen">{{ values.length }} options selected</span></template>
  </multiselect>
  <pre class="language-json"><code>{{ value }}</code></pre>
</div>

【讨论】:

    猜你喜欢
    • 2020-12-13
    • 1970-01-01
    • 2021-02-27
    • 2020-08-11
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    • 2018-12-03
    • 2018-03-22
    相关资源
    最近更新 更多