如果使用多选的时候,添加一个属性multiple
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<div id="app">
<form action="">
<div>
<span>姓名:span>
<span>
<input type="text" v-model='uname' >
span>
div>
<div>
<span>爱好:span>
<span>
<input type="checkbox" id="ball" value="1" v-model='hobby'>
<label for="ball">篮球label>
<input type="checkbox" id='sing' value="2" v-model='hobby'>
<label for="sing">唱歌label>
<input type="checkbox" id='code' value="3" v-model='hobby'>
<label for="code">写代码label>
span>
div>
<div>
<span>性别:span>
<span>
<input type="radio" id='male' value="1" v-model='gender'>
<label for="male">男label>
<input type="radio" id='female' value="2" v-model='gender'>
<label for="female">女label>
span>
div>
<div>
<span>职业:span>
<select v-model='occupation' multiple='true'>
<option value="0">请请选择职业···option>
<option value="1">教师option>
<option value="2">程序员option>
<option value="3">资深程序员option>
select>
div>
<div>
<span>个人简介:span>
<textarea v-model='desc'>textarea>
div>
<div>
<button v-on:click.prevent='handle'>提交button>
div>
form>
div>
<script type="text/javascript" src="../script/vue.min.js">script>
<script type="text/javascript">
new Vue({
el: '#app',
data: {
uname:'lisi',
gender:1,
hobby:['1'],
// occupation:2
occupation:['2','3'],
desc:'nihao'
},
methods:{
handle:function(){
// console.log(this.uname);
// console.log(this.gender);
// console.log(this.hobby);
// console.log(this.hobby.toString());
// console.log(this.occupation);
console.log(this.desc);
},
}
})
script>
body>
html>
方便计算操作
v-model.number
<input type="text" v-model.number='age'>
<button @click='handle'>点击</button>
data: {
age: ''
},
methods:{
handle:function(){
console.log(this.age +12);
}
}
在输入框中输入一个数,那么得到的结果是他与12的和
v-model.trim
v-model.lazy
失去焦点的时候触发
内置指令不满足需求,所以我们要自定义
v-focus
指令获取元素焦点
注册:
// 注册一个全局自定义指令: v-focus
Vue.directive('focus',{
// 当被绑定的元素插入到 DOM 中时
inserted:function(el){
// 获取元素焦点
el.focus()
}
})
使用:
<input type="text" v-focus>
作用:默认指针在该输入框上
改变元素背景色
注册:
//方法一:
Vue.directive('color',{
inserted:function(el,binding){
// 根据指令的参数设置背景色
// console.log(binding.value.color);
el.style.backgroundColor = binding.value.color
}
})
//方法二
Vue.directive('color',{
bind:function(el,binding){
// 根据指令的参数设置背景色
// console.log(binding.value.color);
el.style.backgroundColor = binding.value.color
}
})
data: {
msg:{
color: 'orange'
}
}
使用:
//方法一:
<input type="text" v-color='msg'>
//方法二:
<input type="text" v-color='{color:"orange"}'>
将自定义指令设置为局部指令
directives: {
focus:{
//指令的定义
inserted:function(el){
el.focus()
}
}
}
new Vue({
el: '#app',
data: {
},
methods:{
},
directives: {
color:{
inserted:function(el,binding){
// 根据指令的参数设置背景色
// console.log(binding.value.color);
el.style.backgroundColor = binding.value.color
}
},
}
})
表达式中的计算逻辑可能会比较复杂,使用计算属性可以使模板内容更加简洁
用法:
computed: {
reverseString: function(){
return this.msg.split('').reverse().join('')
}
}
//调用:
<div>{
{
reverseString}}</div>
在计算属性computed
中的逻辑第一次实现的时候会缓存,为了下次使用方便,节省性能
在方法中的逻辑第一次实现的时候不会缓存,下次使用的时候还会执行
数据变化时执行异步或开销大的操作
引入新的属性:watch
在输入框中输入名跟姓,他们之间用空格分开,在输入名跟姓的时候在输入框下面动态改变,效果如下:
使用侦听器的方法实现:
html结构:
<div>
<span>
名:
</span>
<span>
<input type="text" v-model='firstName'>
</span>
</div>
<div>
<span>
姓:
</span>
<span>
<input type="text" v-model='LastName'>
</span>
</div>
<div>{
{
fullName}}</div>
vue:
data: {
firstName:'Jim',
LastName: 'Green',
fullName: 'Jim Green'
}
watch: {
firstName:function(val){
//val:表示变化之后的值
this.fullName = val+' '+this.LastName
},
LastName:function(val){
this.fullName = this.firstName+' '+val
}
}
使用methods方法实现:
{
{fullName()}}
data: {
firstName:'Jim',
LastName: 'Green'
}
methods:{
fullName:function(){
return this.firstName + ' ' + this.LastName
}
}
两种方法都能实现,但是我们可以看到,后者代码更简洁,其实侦听器方法能完成某些特定场景需求,而methods方法不能完成。
实现用户名是否可用
具体案例请看《【vue案例】vue实现用户名是否可用》一文
格式化数据,比如将字符串格式化为首字母大写,将日期格式化指定格式等
Vue.filter('name',function(val){
})
filters:{
name:function(val){
}
}
示例代码:
使用过滤器将 输入单词的首字母转换为大写,并更新到页面
<input type="text" v-model='msg'>
<span>{
{
msg | upper}}</span>
Vue.filter('upper',function(val){
//拿到第一个字符charAt(0)转化为大写,然后拼接上用slice截取的从第二个字符开始到结尾的字符
return val.charAt(0).toUpperCase() + val.slice(1)
})
示例代码:
使用过滤器将 输入单词的首字母转换为大写在转换为小写,并更新到页面
{
{msg | upper}}
{
{msg | upper |lower}}
Vue.filter('lower',function(val){
//拿到第一个字符charAt(0)转化为大写,然后拼接上用slice截取的从第二个字符开始到结尾的字符
return val.charAt(0).toLowerCase() + val.slice(1)
})
示例代码:
测试
效果图:
Vue.filter('name',function(value,arg){})
使用:
例子:使用过滤器格式化日期
{
{date | format('yyyy-MM-dd')}}
Vue.filter('format',function(val,arg){
if(arg == 'yyyy-MM-dd'){
var ret = ''
ret += val.getFullYear()+'-'+(val.getMonth()+1)+'-'+val.getDate()
return ret
}
return val
})
data: {
date:new Date()
}
//输出:2020-11-1
vue实例的生命周期
beforeCreate
在实例初始化后,数据观测和事件配置之前被调用
created
在实例创建完成后被立即调用
beforeMount
在挂载开始之前被调用
mounted
el被新创建的vm.$el替换,并挂载到实例上去之后调用该钩子
beforeUpdate
数据更新时调用,发生在虚拟DOM打补丁之前
updated
由于数据更改导致的虚拟DOM重新渲染和打补丁,在这之后会调用该钩子
beforeDestroy
实例销毁之前调用
destroyed
实例销毁后调用
{
{msg}}
methods:{
update:function(){
this.msg = 'hello'
},
destroy:function(){
this.$destroy()//销毁特殊点
}
}
在挂载开始之前被调用
mounted
el被新创建的vm.$el替换,并挂载到实例上去之后调用该钩子
beforeUpdate
数据更新时调用,发生在虚拟DOM打补丁之前
updated
由于数据更改导致的虚拟DOM重新渲染和打补丁,在这之后会调用该钩子
beforeDestroy
实例销毁之前调用
destroyed
实例销毁后调用
{
{msg}}
methods:{
update:function(){
this.msg = 'hello'
},
destroy:function(){
this.$destroy()//销毁特殊点
}
}