赞
踩
表单提交是开发中非常常见的功能,也是和用户交互的重要手段:
这些都要求我们可以在代码逻辑中获取到用户提交的数据,我们通常会使用v-model指令来完成:
官方有说到,v-model的原理其实是背后有两个操作:
我们再来绑定一下其他的表单类型:textarea、checkbox、radio、select
我们来看一下绑定textarea:
我们来看一下v-model绑定checkbox:单个勾选框和多个勾选框
单个勾选框:
多个复选框:
当是多个复选框时,因为可以选中多个,所以对应的data中属性是一个数组。
当选中某一个时,就会将input的value添加到数组中。
v-model绑定radio,用于选择其中一项;
和checkbox一样,select也分单选和多选两种情况。
单选:只能选中一个值
多选:可以选中多个值
目前我们在前面的案例中大部分的值都是在template中固定好的:
在真实开发中,我们的数据可能是来自服务器的,那么我们就可以先将值请求下来,绑定到data返回的对象中,
lazy修饰符是什么作用呢?
我们先来看一下v-model绑定后的值是什么类型的:
如果我们希望转换为数字类型,那么可以使用 .number 修饰符:
另外,在我们进行逻辑判断时,如果是一个string类型,在可以转化的情况下会进行隐式转换的:
如果要自动过滤用户输入的首尾空白字符,可以给v-model添加 trim 修饰符:
现在我们来做一个相对综合一点的练习:书籍购物车
案例说明:
代码:
html部分:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <link rel="stylesheet" href="./style.css"> </head> <body> <div id="app"></div> <template id='liu'> <template v-if="books.length>0"> <table> <thead> <th>序号</th> <th>书籍名称</th> <th>出版日期</th> <th>价格</th> <th>购买数量</th> <th>操作</th> </thead> <tbody> <tr v-for="(book,index) in books" :key="book.id"> <td>{{index+1}}</td> <td>{{book.name}}</td> <td>{{book.date}}</td> <td>{{formatPrice(book.price)}}</td> <td> <button @click="decrement(index)" :disabled="book.count<=1">-</button> <span class="counter">{{book.count}}</span> <button @click="increment(index)">+</button> </td> <td> <button @click="removeBook(index)">移除</button> </td> </tr> </tbody> </table> <h2>总价格为:{{formatPrice(totalPrice)}}</h2> </template> <template v-else> <h2>购物车为空</h2> </template> </template> <script src='../../js/vue.js'></script> <script src='./index.js'></script> </body> </html>
js部分:
Vue.createApp({ template: '#liu', data() { return { books: [{ id: 1, name: '《算法导论》', date: '2006-9', price: 85.00, count: 1 }, { id: 2, name: '《UNIX编程艺术》', date: '2006-2', price: 59.00, count: 1 }, { id: 3, name: '《编程珠玑》', date: '2008-10', price: 39.00, count: 1 }, { id: 4, name: '《代码大全》', date: '2006-3', price: 128.00, count: 1 } ] } }, computed: { totalPrice(){ let finalPrice=0 for(let book of this.books){ finalPrice+=book.count*book.price } return finalPrice }, // Vue3不支持过滤器了, 推荐两种做法: 使用计算属性/使用全局的方法 filterBooks(){ return this.books.map(item=>{ const newItem=Object.assign({},item) newItem.price='¥'+item.price return newItem }) } }, methods: { increment(index){ this.books[index].count++ }, decrement(index){ this.books[index].count-- }, removeBook(index){ this.books.splice(index,1) }, formatPrice(price){ return '¥'+price } } }).mount('#app')
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。