如何更改 Vuejs3 上的 <select> 值?

Posted

技术标签:

【中文标题】如何更改 Vuejs3 上的 <select> 值?【英文标题】:How to change <select> value on Vuejs3? 【发布时间】:2022-01-19 06:59:42 【问题描述】:

我想更改 &lt;select&gt; 的值以获取 ul &gt; li 的值,并在 &lt;select&gt; v-model 上使用此值 id。

<div>
    <select id="selected" @click="show-modal" v-model="subcategory_id">
       <option></option>
    </select>
</div>

<div class="modal">
    <header class="modal-card-head">
        <p class="modal-card-title">Choose category</p>
        <button @click.prevent="close-modal" class="delete" aria-label="close"></button>
    </header>
    <section class="modal-card-body">
        <div class="card ">
             <ul class="cl-menu">
                  <li v-for="category in categories" :key="category.id" >
                  <a href="#">category.name                                                            
                   <ul>
                     <li @click="getLi(sub)" v-for="sub in category.subcategory" :key="sub.id">
                       <a class="px-2" href="#">sub.name</a>
                     </li>
                   </ul>  
                  </li>
             </ul>
        </div>
    </section>
</div>

Vuejs

getLi: function(e) 
    const m = document.querySelector('.modal');
    document.getElementById("selected").options[0].value = e.name;
    m.classList.toggle('is-active')
    console.log(e.name)

我能够从列表中获取值,但无法将其传递给 select 值和值的 id 到 v-model。 提前致谢

【问题讨论】:

您不应该将 Vue 与 vanilla DOM API 混合使用。 Vue 具有 DOM 的内部表示,当 Vue 需要重新渲染时,您直接更改的任何内容都可能会丢失。 @click="subcategory_id = sub" 我不明白你在做什么,如果你不介意,可以再解释一下吗? 【参考方案1】:

不要像@Thomas 所说的那样操作 DOM,而应该使用 Vue 的数据绑定:

new Vue(
  el: '#app',
  template: `<div><div>
    <select id="selected" @click="show-modal" v-model="subcategory_id" disabled>
                  <optgroup v-for="category in categories" :key="category.id" :label="category.name">
                     <option v-for="sub in category.subcategory" :key="sub.id" :value="sub.id">
                       sub.name
                     </option> 
                  </optgroup>
    </select>
    <button @click="openModal">Choose</button>
</div>

<div class="modal" v-if="showModal">
    <header class="modal-card-head">
        <p class="modal-card-title">Choose category</p>
        <button @click.prevent="closeModal" class="delete" aria-label="close">&times;</button>
    </header>
    <section class="modal-card-body">
        <div class="card ">
             <ul class="cl-menu">
                  <li v-for="category in categories" :key="category.id" >
                  category.name                                                            
                   <ul>
                     <li @click="getLi(sub)" v-for="sub in category.subcategory" :key="sub.id">
                       <a class="px-2" href="#">sub.name</a>
                     </li>
                   </ul>  
                  </li>
             </ul>
        </div>
    </section>
</div></div>`,
  data() 
    return 
      showModal: true,
      subcategory_id: null,
      categories: [
        name: 'A',
        id: 1,
        subcategory: [
          name: 'A.1',
          id: 2
        ]
      , 
        name: 'B',
        id: 3,
        subcategory: [
          name: 'B.1',
          id: 4
        ]
      ]
    
  ,
  methods: 
    getLi: function(subId) 
      this.subcategory_id = subId.id
      this.closeModal()
    ,
    closeModal() 
      this.showModal = false
    ,
    openModal() 
      this.showModal = true
    
  
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app"></div>

【讨论】:

非常感谢它起作用了,但是点击时如何不显示&lt;select&gt;下拉菜单?因为模态应该在点击时出现。 不客气。您不希望&lt;select /&gt; 在点击时不打开吗?禁用它呢? 是的,用户从模态而不是从下拉列表中选择类别,我尝试禁用但没有按我的意愿工作,单击时模态未出现 当然,我在&lt;select /&gt; 中添加了disabled 和切换模式的功能。请参阅我的更新答案。 好的明白,谢谢..

以上是关于如何更改 Vuejs3 上的 <select> 值?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Composition API (vuejs3) 制作文件上传组件

Visual Studio Code 上的 vuejs3 调试不起作用

如何在 vuejs3 应用程序的设置中调用方法?

<select> 上的 jQuery 更改事件未在 IE 中触发

vuejs3

vueJS3 - 如何触发来自兄弟组件的事件的函数