vue day01 基本指令实战
架构分层
MVC
Model 数据层
View 视图层
Controller 控制层
缺点:依赖复杂
MVP
Model 数据层
View 视图层
Presenter
MVVM
Model 数据层
View 视图层
ViewModel
响应式数据原理
响应式属性:能监听到修改操作,并更新视图
如何设置一个响应式属性(属性特性)
值属性: 拥有值的属性
configurable 可配置性 (其他属性特性的总开关)
enumerable 可枚举性
writeable 可写性
value 属性的值
》特别说明:
1. 传统方式添加的属性, 所有属性特性默认为true
2. 通过Object.defineProprety()添加的属性, 所有属性特性默认为false
储存器属性: 本身没有值, 一般用于代理其他数据
configurable
enumerable
get
set
Object.defineProperty(target,prop,descriptor) 设置属性
target : 目标对象
prop: 目标属性
descriptor: 属性特性
case:
目的:控制data.age为不可修改 Object.defineProperty(data,'age',{ writable:false }) 目的:控制data.password不可枚举 Object.defineProperty(data,'password',{ enumerable:false })
储存器属性
get 读取时:执行getter方法
set 设置时: 执行setter方法
响应式属性的原理:把值属性变成存储器属性(getter&setter)
实例化Vue时,内部自动遍历Data下所有的属性,把所有属性变成getter&setter,并写入vm实例
实例化后,如果还想设置响应式属性,必须通过:Vue.set()
vm.score.chinese = 55
vue.set(vm,score,'chinese',55);
今日案例
/*技术栈
*bootstrap
* vue
*/
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>5.todolist</title>
<link rel="stylesheet" href="bootstrap/css/bootstrap.css">
<script src="./js/vue.js"></script>
</head>
<body>
<div class="container">
<h1>5.todolist</h1>
<div id="app">
<div class="input-group mb-3">
<input type="search" class="form-control" ref="search" v-model="todoTitle" @keyup.enter="addItem">
<div class="input-group-append">
<button class="btn btn-success" v-on:click="addItem">添加</button>
</div>
</div>
<table class="table table-striped table-hover">
<thead class="thead-dark">
<tr>
<th scope="col">#</th>
<th scope="col">待办事项</th>
<th scope="col">是否完成</th>
<th scope="col">操作</th>
</tr>
</thead>
<tbody>
<tr v-for="item,idx in todolist">
<th scope="row">{{idx+1}}</th>
<td>{{item.title}}</td>
<td>{{item.done ? '是' : '否'}}</td>
<td>
<button class="btn btn-success btn-sm" @click="completeItem(item.id)">完成</button>
<button class="btn btn-danger btn-sm" @click="removeItem(item.id)">删除</button>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<script>
const vm = new Vue({
el:'#app',
data:{
todolist:[
{
id: 1,
title: '实现个小目标,月薪过万',
done: false, // 是否完成
addtime: Date.now()
},
{
id: 2,
title: '实现第二个小目标,赚他一个亿',
done: false,
addtime: Date.now() + 100
},
],
todoTitle:''
},
methods:{
addItem(){
const data = {
id: this.todolist.length+1,
title:this.todoTitle,
done: false,
addtime: Date.now()
}
this.todolist.unshift(data)
// 清空并自动获得焦点
this.todoTitle = '';
this.$refs.search.focus();
},
removeItem(id){
console.log('remove');
this.todolist = this.todolist.filter(item=>item.id!==id)
},
completeItem(id){
console.log('complete')
this.todolist = this.todolist.map(item=>{
if(item.id === id){
item.done = true
}
return item;
})
}
}
})
</script>
</body>
</html>

浙公网安备 33010602011771号