Vuejs 3 替代 select 绑定

Vuejs 3 alternative select binding

我正在尝试将 select 元素绑定到自定义对象的值。这里的关键是所讨论的对象 属性 有一个自定义的 getter。该值设置为数字,但在访问时 returns 关联值作为字符串。为什么我这样做是一个很长的故事。

所以我有一个键值对对象做一些选择:

<select v-model="myObject.myProperty">
    <option v-for="v, k in myOptions" :key="k" :value="k">{{v}}</option>
</select>
{{myObject.myProperty}} //this line prints out the correct value

但是选项没有显示为 selected。 myObject.myProperty 的值已更新,它是我所期望的 returns。我怀疑在幕后,它正确地将 k 分配给了我的自定义对象,但是因为它 returns 是一个不同的字符串值,所以 Vue 本身无法确定要标记哪个选项 'selected' .

手动添加 :selected 没有帮助:

<option v-for="v, k in myOptions" :key="k" :value="k" :selected="v === myObject.myProperty">{{v}}</option>

我也试过手动绑定select而不是使用v-model属性,同样不行:

<select :value="myObject.myProperty" @input="myObject.myProperty = $event.target.value"

是否有其他方法来连接 select/option 情况?如果没有,我的下一步是构建具有仿 select 功能的自定义组件。


为清楚起见,myOptions 是这样的键值

{ 
    0 : 'Option 1', 
    1 : 'Option 2',
}

但是 myObject 有特殊的设置器,可以获取并记住密钥,然后还有一个特殊的 getter 而不是 returns 来自 myOptions 的值。

那么:

myObject.myProperty = 0;
console.log(myObject.myProperty) //logs 'Option 1'

When when I set the value to the key (k) I get back the corresponding value when the option is selected and the value of 'myObject.myProperty' is what I expect .示例:我从下拉列表中选择 'Option 1',它的值 0 来自键 k.

然而,尽管 myObject.myProperty 具有我想要的值,但我无法让 Vue 将实际的 html 选项显示为 selected,可能是因为返回的值myObject.myProperty'Option 1' 而不是 0

不确定我是否正确理解您的问题。因此,在下面添加我对您的要求的意见。

As myObject.myProperty 返回您在 select 中传递的值,并且根据您的代码,您将 index 作为值传递。

因此,在 :selected 中进行比较时,LHS 和 RHS 都应包含您通过的项目的 index

工作演示:

const app = new Vue({
  el: '#app',
  data() {
    return {
      myOptions: [{
        id: 1,
        name: 'alpha'
      }, {
        id: 2,
        name: 'beta'
      }, {
        id: 3,
        name: 'gama'
      }],
      myObject: {
        myProperty: ''
      }
    }
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
    <select v-model="myObject.myProperty">
      <option v-for="(item, index) in myOptions" :selected="myObject.myProperty === item.id" :key="item.id" :value="item.id">{{item.name}}</option>
    </select>
    {{myObject.myProperty}}
  </div>

更新基于新提供的信息。

在模板中:

    <select v-model="selectedOption">
      <option v-for="(v, k) in options" :key="k" :value="k">
        {{ v }}
      </option>
    </select>

在 JS 中

data() {
  return {
    selectedOption: null,
    options: {
      0: 'Option 1',
      1: 'Option 2',
    },
  };
}

通过选项键设置selectedOption将正确显示所选选项。

这是一个 link 使用您的数据结构的工作示例。它包含两个选择,都使用相同的对象作为其数据源。一个带有默认选择。另一个没有。 https://stackblitz.com/edit/vue-efekym?file=src/App.vue

根据最新信息,这已经过时了 根据您进一步示例中的逻辑,我认为问题在于将循环中的 kv 变量合并在一起。虽然很难说,因为没有任何示例数据或完全隔离的组件可以排除该行为。

但是在你后面的例子中你有:

<option v-for="v, k in myOptions" :key="k" :value="k" :selected="v === myObject.myProperty">{{v}}</option>

我推断您认为 myObject.myProperty 持有变量 v 的值,而实际上您将值设置为变量 k:value="k"

见证

通过更正此问题,我相信您的问题将会得到解决,您还注意到了 int 到 string 的转换。取决于 how/where 这正在发生,这也可能导致您头疼,因为这永远不会等同于 true。 '1231' === 1231

好的,实际答案:

<select @input="myObject.myProperty = $event.target.value">
    <option v-for="v, k in myOptions" :selected="myObject.myProperty === v" :key="k" :value="k">{{v}}</option>
</select>

v-model 在这里不起作用,因为它根本不关心您是否手动应用了 selected:它总是会尝试将选项值与 v-model 属性 值。由于此对象采用一个值 setter 和 returns 另一个值 getter,因此它们永远不会对齐。

相反,使用 @input 手动将值分配给对象,并将 getter 中的值与 selected 选项中的值相匹配。