- 可以使用v-model指令的元素有哪些(至少列举出5个表单元素)?
Input、textarea、radio、checkbox、select、
2.v-model:可以实现 表单元素和 Model 中数据的双向数据绑定,注意:v-model 只能运用在 表单元素中;
1、基本使用:
<body>
<!-- 被app实例所控制的区域 -->
<div id="app">
<input type="text" v-model="message">
<h2>{{message}}</h2>
</div>
<script src="../vue.js"></script>
<script>
// 创建实例对象
const app = new Vue({
// 指定控制的区域
el: '#app',
data: {
message: "hello"
},
methods: {}
});
</script>
</body>
2、原理:
<body>
<!-- 被app实例所控制的区域 -->
<div id="app">
<!-- <input type="text" v-model="message"> -->
<input type="text" v-model="message" @input="valueChange">
<input type="text" v-model="message" @input="message = $event.target.value">
<h2>{{message}}</h2>
</div>
<script src="../vue.js"></script>
<script>
// 创建实例对象
const app = new Vue({
// 指定控制的区域
el: '#app',
data: {
message: "hello"
},
methods: {
valueChange(event) {
this.message = event.target.value;
}
}
});
</script>
</body>
分析:
1、input框有个input事件,用于监听用户输入的内容
2、绑定的事件需要加一个event参数保证运行成功
3、v-model其实是一个语法糖,背后包含俩个操作:
(1)v-bind绑定一个value属性
(2)v-on指令给当前元素绑定input事件
3、v-model搭配radio使用
<body>
<!-- 被app实例所控制的区域 -->
<div id="app">
<!-- label确保点击文字也可以选中radio,为保证选择男女不能同时,可以加个name="sex"。相同name则会互斥,而value则是为了获取选择的值,默认选择男,sex双向绑定则会根据value刷新页面 -->
<label for="male">
<!-- <input type="radio" id="male" name="sex" value="男" v-model="sex">男 -->
<!-- 当有v-model时可以不用加name保证俩个radio的互斥 -->
<input type="radio" id="male" value="男" v-model="sex">男
</label>
<label for="female">
<!-- <input type="radio" id="female" name="sex" value="女" v-model="sex">女 -->
<!-- 当有v-model时可以不用加name保证俩个radio的互斥 -->
<input type="radio" id="female" value="女" v-model="sex">女
</label>
<p>你的选择是:{{sex}}</p>
</div>
<script src="../vue.js"></script>
<script>
// 创建实例对象
const app = new Vue({
// 指定控制的区域
el: '#app',
data: {
sex: "男"
},
methods: {}
});
</script>
</body>
4.1、v-model搭配checkbox使用(单个checkbox)
<body>
<!-- 被app实例所控制的区域 -->
<div id="app">
<label for="agree">
<input type="checkbox" id="agree" v-model="isAgree">同意协议
</label>
<h2>你选择的是:{{isAgree}}</h2>
<button :disabled="!isAgree">下一步</button>
</div>
<script src="../vue.js"></script>
<script>
// 创建实例对象
const app = new Vue({
// 指定控制的区域
el: '#app',
data: {
isAgree: false,
},
methods: {}
});
</script>
</body>
4.2、v-model搭配checkbox使用(多个checkbox)
<body>
<!-- 被app实例所控制的区域 -->
<div id="app">
<input type="checkbox" id="agree" value="篮球" v-model="hobbies">篮球
<input type="checkbox" id="agree" value="足球" v-model="hobbies">足球
<input type="checkbox" id="agree" value="羽毛球" v-model="hobbies">羽毛球
<input type="checkbox" id="agree" value="乒乓球" v-model="hobbies">乒乓球
<h2>你选择的是:{{hobbies}}</h2>
</div>
<script src="../vue.js"></script>
<script>
// 创建实例对象
const app = new Vue({
// 指定控制的区域
el: '#app',
data: {
hobbies: []
},
methods: {}
});
</script>
</body>
分析:
1、单个勾选框,v-model绑定的是布尔值,此时input中的value不影响v-model的值
2、多个复选框,因为可以选择多个,所以对应的data中的属性是一个数组,当选择某一个时,会将input的value添加到数组中
5、v-model搭配select使用
<body>
<!-- 被app实例所控制的区域 -->
<div id="app">
<!-- 单选 -->
<select name="abc" v-model="fruit">
<option value="苹果">苹果</option>
<option value="葡萄">葡萄</option>
<option value="香蕉">香蕉</option>
<option value="西红柿">西红柿</option>
</select>
<h2>你选择的是:{{fruit}}</h2>
<!-- 多选 -->
<!-- multiple是拉选不是点选 -->
<select name="abc" v-model="fruits" multiple>
<option value="苹果">苹果</option>
<option value="葡萄">葡萄</option>
<option value="香蕉">香蕉</option>
<option value="西红柿">西红柿</option>
</select>
<h2>你选择的是:{{fruits}}</h2>
</div>
<script src="../vue.js"></script>
<script>
// 创建实例对象
const app = new Vue({
// 指定控制的区域
el: '#app',
data: {
fruit: "香蕉", //单选 字符串类型
fruits: [] //多选 数组类型
},
methods: {}
});
</script>
</body>
分析:
1、单选:绑定的是一个值(字符串),当我们选择option中的一个时,会将它对应的value赋值到data的fruit中;
2、多选:绑定的是一个数组,当拉选多个值时,会将它对应的value赋值到data的fruits中;
6、input中的值绑定
我们在真实开发中,不是将数据写死的,而是动态绑定获取的,因此,上文多个checkbox可做以下更改:
<body>
<!-- 被app实例所控制的区域 -->
<div id="app">
<input type="checkbox" id="agree" value="篮球" v-model="hobbies">篮球
<input type="checkbox" id="agree" value="足球" v-model="hobbies">足球
<input type="checkbox" id="agree" value="羽毛球" v-model="hobbies">羽毛球
<input type="checkbox" id="agree" value="乒乓球" v-model="hobbies">乒乓球
<h2>你选择的是:{{hobbies}}</h2>
</div>
<script src="../vue.js"></script>
<script>
// 创建实例对象
const app = new Vue({
// 指定控制的区域
el: '#app',
data: {
hobbies: []
},
methods: {}
});
</script>
</body>
改进:
<body>
<!-- 被app实例所控制的区域 -->
<div id="app">
<input type="checkbox" id="agree" value="篮球" v-model="hobbies">篮球
<input type="checkbox" id="agree" value="足球" v-model="hobbies">足球
<input type="checkbox" id="agree" value="羽毛球" v-model="hobbies">羽毛球
<input type="checkbox" id="agree" value="乒乓球" v-model="hobbies">乒乓球
<h2>你选择的是:{{hobbies}}</h2>
<label v-for="item in originHobbies" :for="item">
<input type="checkbox" :value="item" v-model="hobbies" :id="item">{{item}}
</label>
</div>
<script src="../vue.js"></script>
<script>
// 创建实例对象
const app = new Vue({
// 指定控制的区域
el: '#app',
data: {
hobbies: [],
originHobbies: ["篮球", "足球", "羽毛球", "乒乓球", "台球"]
},
methods: {}
});
</script>
</body>
分析:
v:bind值绑定,:for=“item”和:id=“item”是为了确保每个for跟每个id代表的input对应起来!
因此,input中的值绑定,也就是想说v-bind的值绑定
7、v-model的修饰符
1、lazy修饰符:
默认情况下数据的双向绑定是一旦input框的值发生变化data的数据会自动更新,而该修饰符会让数据在失去焦点或者回车的时候才更新数据,简称懒加载!
2、number修饰符:
默认情况下,input输入的数字是字符串类型,而当我们需要在数字输入框内处理的是数字类型,,则加.number可以在输入框中输入内容时自动转换为数字类型
3、trim修饰符:
可以去除输入框中输入内容首尾的空格
<body>
<!-- 被app实例所控制的区域 -->
<div id="app">
<label for="1">
<input type="text" id="1" v-model="message">
<input type="text" id="1" v-model.lazy="message">
</label>
<h2>当前内容:{{message}}</h2>
<label for="2">
年龄:<input type="number" id="2" v-model="age">
年龄:<input type="number" id="2" v-model.number="age">
</label>
<h2>年龄:{{age}} 类型:{{typeof age}}</h2>
<label for="3">
<input type="text" id="3" v-model="message">
<input type="text" id="3" v-model.trim="message">
</label>
<h2>当前内容:-----{{message}}-----</h2>
</div>
<script src="../vue.js"></script>
<script>
// 创建实例对象
const app = new Vue({
// 指定控制的区域
el: '#app',
data: {
message: "hello",
age: 13
},
methods: {}
});
</script>
</body>
1、lazy修饰符实例:
2、number修饰符实例:
3、trim修饰符实例:
可见得message不加修饰符后面的空格还在!
补充:
- Vue中过滤器的用法?经过过滤器处理后,会不会改变数据的原始值?多个过滤器是否可以串联?当全局过滤器和局部过滤器重名时,会采用全局还是局部过滤器?
定义:对内容或数据进行过滤(二次处理)的一种方式
写法:Vue.filter("过滤器名称",过滤方式);
使用:过滤器类似于管道流
种类:局部过滤器和全局过滤器
全局过滤器定义:
Vue.filter('replaceStr', function(msg) {
// replace()方法:替换字符串中敏感词汇,用*替换掉敏感词
return message.replace(/毛病/g, '**')
});
局部过滤器:
//定义私用局部过滤器。只能在当前 vue 对象中使用
filters: {
strDeal(str) {
let arr = [];
if (str.includes("呱")) {
arr.push(str+"可爱的小青蛙");
return arr.join("");
}
}
}
注意:
过滤器实质不改变原始数据
当局部过滤器与全局过滤器名称相同时,就近原则来调用,即局部过滤器优先于全局过滤器被调用;
一个表达式可以使用多个过滤器;
过滤器之间需要用管道符“|”隔开。其执行顺序从左往右;