vue(三)
列表过滤+列表排序+收集表单数据+过滤器初识vue模板语法转存失败重新上传取消数据绑定转存失败重新上传取消el与data的两种写法转存失败重..
列表过滤
方法一:watch
<div id="app">
<h2>人员列表</h2>
<input type="text" v-model="keyword" placeholder="请输入姓名">
<ul>
<li v-for="(value,index) in filperson">
{{value.name}}-{{value.age}}-{{value.sex}}
</li>
</ul>
</div>
<script>
new Vue({
el:"#app",
data:{
keyword:"",
person:[
{name:"小米",age:19,sex:"男"},
{name:"小例",age:18,sex:"男"},
{name:"小时",age:16,sex:"女"},
{name:"小发",age:29,sex:"女"},
],
filperson:[]
},
watch:{
keyword:{
immediate:true,
handler(val){
this.filperson=this.person.filter((p)=>{
return p.name.indexOf(val)!==-1
})
}
}
}
})
</script>
filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。
注意: filter() 不会对空数组进行检测。
注意: filter() 不会改变原始数组。
例:
var ages = [32, 33, 16, 40];
function checkAdult(age) {
return age >= 18;
}
function myFunction() {
document.getElementById("demo").innerHTML = ages.filter(checkAdult);
}
方法二:computed
<div id="app">
<h2>人员列表</h2>
<input type="text" v-model="keyword" placeholder="请输入姓名">
<ul>
<li v-for="(value,index) in filperson">
{{value.name}}-{{value.age}}-{{value.sex}}
</li>
</ul>
</div>
<script>
new Vue({
el:"#app",
data:{
keyword:"",
person:[
{name:"小米",age:19,sex:"男"},
{name:"小例",age:18,sex:"男"},
{name:"小时",age:16,sex:"女"},
{name:"小发",age:29,sex:"女"},
],
},
computed:{
filperson(){
return this.person.filter((p)=>{
return p.name.indexOf(this.keyword)!==-1
})
}
}
})
</script>
列表排序:
<html>
<head>
<title>TODO supply a title</title>
<meta charset="GBK">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="root">
<h2>人员列表</h2>
<input type="text" v-model="keyword" placeholder="请输入姓名">
<br>
<button @click="sortType=2">年龄升序</button>
<button @click="sortType=1">年龄降序</button>
<button @click="sortType=0">原顺序</button>
<ul>
<li v-for="(value,index) in filperson">
{{value.name}}-{{value.age}}-{{value.sex}}
</li>
</ul>
</div>
<script>
new Vue({
el:"#root",
data:{
sortType:0,
keyword:"",
person:[
{name:"小米",age:19,sex:"男"},
{name:"小例",age:18,sex:"男"},
{name:"小时",age:16,sex:"女"},
{name:"小发",age:29,sex:"女"},
],
},
computed:{
filperson(){
const arr = this.person.filter((p)=>{
return p.name.indexOf(this.keyword)!==-1
})
//判断是否要排序
if(this.sortType){
arr.sort((p1,p2)=>{
return this.sortType===1?p2.age-p1.age:p1.age-p2.age
})
}
return arr
}
}
})
</script>
</body>
</html>
监视总结
Vue监视数据的原理:
1. vue会 监视data中所有层次的数据。
2.如何监测对象中的数据?
通过Setter实现监视。且要在new Vue时就传入要监测的数财。
(1).对象中后追加的属性,Vue默认不做响应式处理
(2).如需给后添加的属性做响应式,请使用如下API:
Vue.set (target, propertyName/index. value) 或
Vm.$set(target. propertyName/ index, value )
3.如何监测数组中的数据?
通过包裹数组更新元素的方法实现,本质就是做了两件事:
(1).调用原生对应的方法对数组进行更新。
(2).重新解析模板,进而更新页面。
4.在Vue修改数组中的某个元素定 要用如下方法:
1.使用这些API:push()、pop()、 shift()、 unshift()、 splice(),sort()、 reverse( )
2.Vue.set()或vm.$set()
特别注意: Vue.set() 和vm.$set() 不能给vm 或vm的根数据对象添加属性! !
实例:
<html>
<head>
<title>TODO supply a title</title>
<meta charset="GBK">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="root">
<h2>人员列表</h2>
<button @click="student.age++">年龄加一</button>
<button @click="addSex">添加性别</button>
<button @click.once="addFriend">在第一个位置添加朋友</button><br>
<button @click="updateFriendName">修改朋友姓名</button>
<button @click="removeHobby2">移除hobby2</button>
<button @click.once="addHobby">添加爱好</button><br>
<h2>姓名:{{student.name}}</h2>
<h2>年龄:{{student.age}}</h2>
<h2 v-if="student.sex">性别:{{student.sex}}</h2>
<h2>爱好</h2>
<ul>
<li v-for="(value,index) in student.hobby" :key="index">
{{value}}
</li>
</ul>
<h2>朋友</h2>
<ul>
<li v-for="(value,index) in student.friends" :key="index">
{{value.name}}-{{value.age}}
</li>
</ul>
</div>
<script>
new Vue({
el:"#root",
data:{
student:{
name:"alice",
age:18,
hobby:["hobby1","hobby2","hobby3"],
friends:[
{name:"zzx",age:18},
{name:"zzy",age:19},
{name:"zzz",age:20}
]
}
},
methods:{
addSex(){
//追加属性
//Vue.set(this.student,"sex","男")
this.$set(this.student,"sex","男")
},
addFriend(){
//追加数组值
this.student.friends.unshift({name:"zza",age:10})
},
updateFriendName(){
this.student.friends[0].name="xugai"
},
removeHobby2(){
this.student.hobby=this.student.hobby.filter((h)=>{
return h!=="hobby2"
})
},
addHobby(){
this.student.hobby.push("hobby4")
}
}
})
</script>
</body>
</html>
收集表单数据
若: <input type="text"/>. 则v - model收集的是value值,用户输入的就是value值。
若: <input type= "radio"/>,则v - model收集的是value值。且要给标签配置value值。
若: <input type= ”checkbox"/>
1.没有配置input的value属性,那么收集的就是checked (勾选or未勾选,是布尔值)
2.配置input的value属性:
(1 )v- mode1的初始值是非数组,那么收集的就是checked
(2)v- model的初始值是数组,那么收集的的就是value组成的数组
备注: v-model的 三个修饰符:
lazy:失去焦点再收集数据
number:输入字符串转为有效的数字
trim:输入首尾空格过滤
实例:
<html>
<head>
<title>TODO supply a title</title>
<meta charset="GBK">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="root">
<form @submit.prevent="demo">
账号:<input type="text" v-model.trim="userInfo.name"><br/><br/>
密码:<input type="password" v-model="userInfo.password"><br/><br/>
年龄:<input type="number" v-model.number="userInfo.age"><br/><br/>
性别:
男<input type="radio" name="sex" v-model="userInfo.sex" value="male">
女<input type="radio" name="sex" v-model="userInfo.sex" value="female"><br/><br/>
爱好:
学习<input type="checkbox" v-model="userInfo.hobby" value="study">
游戏<input type="checkbox" v-model="userInfo.hobby" value="game">
吃饭<input type="checkbox" v-model="userInfo.hobby" value="eat"><br/><br/>
所属校区
<select v-model="userInfo.city">
<option value="">请选择校区</option>
<option value="ShanDong">山东</option>
<option value="BeiJing">北京</option>
<option value="HeBei">河北</option>
</select><br/><br/>
其他信息
<textarea v-model.lazy="userInfo.other"></textarea><br/><br/>
<input type="checkbox" v-model="userInfo.agree">同意并接受协议<br/><br/>
<button>提交</button>
</form>
</div>
<script>
new Vue({
el:"#root",
data:{
userInfo:{
name:"",
password:"",
sex:"female",
hobby:[],
city:"ShanDong",
other:"",
agree:""
}
},
methods:{
demo(){
console.log(JSON.stringify(this.userInfo))
}
}
})
</script>
</body>
</html>
过滤器
定义:对要显示的数据进行特定格式化后再显示(适用于一些简单逻辑的处理)。
语法:
1.注册过滤器: Vue.filter(name, callback)或new Vue{filters :{}}
2.使用过滤器: {{ xxx| 过滤器名}} 或v-bind:属性 = "xx| 过滤器名"
备注:
1.过滤器也可以接收额外参数、多个过滤器也可以串联
2.并没有改变原本的数据,是产生新的对应的数据
<html>
<head>
<title>TODO supply a title</title>
<meta charset="GBK">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<!--负责时间格式化-->
<script src="https://cdn.bootcdn.net/ajax/libs/dayjs/1.4.1/dayjs.min.js"></script>
</head>
<body>
<div id="root">
<h2>显示格式化后时间</h2>
<!--计算属性实现-->
<h3>时间是:{{fmtTime}}</h3><br/><br/>
<!--methods实现-->
<h3>时间是:{{getFmtTime()}}</h3><br/><br/>
<!--过滤器实现-->
<h3>时间是:{{time|timeFormater}}</h3><br/><br/>
<!--过滤器实现(传参)+ 多过滤器使用-->
<h3>时间是:{{time|timeFormater("YYYY:MM:DD")|mySlice}}</h3><br/><br/>
</div>
<script>
new Vue({
el:"#root",
data:{
time:1648518723
},
methods:{
getFmtTime(){
return dayjs(this.time).format("YYYY年MM月DD日 HH:mm:ss")
}
},
computed:{
fmtTime(){
return dayjs(this.time).format("YYYY年MM月DD日 HH:mm:ss")
}
},
filters:{
timeFormater(value,str="YYYY年MM月DD日"){
return dayjs(value).format(str)
},
mySlice(value){
return value.slice(0,4)
}
}
})
</script>
</body>
</html>
更多推荐
所有评论(0)