v-model: 选择列表

by edith_tang

HTML

<div id="app">

<!-- 
  选择列表,也就是下拉选择器
  
  单选的场景:
    1. v-model绑定一个String类型的数据
    2. 选中后,会优先匹配选中项的value值,如果没有value值,则会去匹配option的text。
    3. 会在初始化后忽视option本身的selected属性
    4. 当绑定的数据的初始值就是某个选项的value值时,初始化后会默认选中改选项
-->
<select v-model="selected">
  <option>《Vue.js 实战》</option>
  <option value="ES6 入门指南">《ES6 入门指南》</option>
  <option value="JavaScript 高级程序设计">《JavaScript 高级程序设计》</option>
</select>
<p>
哪一本书让您获益最多:{{ selected }}
</p>
<hr>
<!--
  选择列表多选的场景:
    1. 在<select>标签上添加multiple属性,即可变成多选列表
    2. 和复选框一样,用v-model会绑定一个Array类型的数据
    3. 选中选项会,会将它匹配(优先匹配value,次则<option>的text)并push到Array数据中
-->
<select v-model="books" multiple>
  <option value="cholera">Love in the Time of Cholera</option>
  <option>Wuthering Heights</option>
  <option>Jane Eyre</option>
  <option>Pride and Prejudice</option>
  <option value="Gatsby">The Great Gatsby</option>
</select>
<div v-if="!books.length">
  没有看过吗?那您听说过薄荷阅读吗?
</div>
<div v-else>
  哇,您真是博览群书,这个列表里,就看过这么多呢:
  <ul v-for="book in books">
    <li>{{ book }}</li>
  </ul>
</div>
<hr>

<!--
  1 在业务中,<option>经常用v-for动态输出,value和text也是用v-bind来动态输出的
  2 虽然在<select>中可以简单地完成下拉选择需求,但是在实际业务中反而不常用。因为它的样式依赖平台和浏览器,无法统一,也不美观,功能也受限(比如,不支持搜索),所以常见的解决方案是用<div>模拟一个类似的控件。具体可以在学习了组件(components)的内容后再进行尝试。
-->
<select v-model="works" multiple>
  <option 
    v-for="option in options"
    :value="option.value" >{{ option.text }}</option>
</select>
<div v-if="!works.length">
  没有看过吗?那您听说过薄荷阅读吗?
</div>
<div v-else>
  哇,您真是博览群书,这个列表里,就看过这么多呢:
  <ul v-for="work in works">
    <li>{{ work }}</li>
  </ul>
</div>
<hr>



</div>

JavaScript

var app = new Vue({
	el: '#app',
  data: {
  	selected: 'JavaScript 高级程序设计',
    books: [],
    works: [],
    options: [
    	{
      	text: 'LOVE IN THE TIME OF CHOLERA',
        value: 'love in the time of cholera'
      },
      {
      	text: 'WUTHERING HEIGHTS',
        value: 'wuthering heights'
      },
      {
      	text: 'JANE EYRE',
        value: 'jane eyre'
      },
      {
      	text: 'PRIDE AND PREJUDICE',
        value: 'pride and prejudice'
      },
      {
      	text: 'THE GREAT GATSBY',
        value: 'the great gatsby'
      }
    ]
  }
})