品牌管理案例
添加新品牌, 删除品牌, 根据条件筛选品牌
首先引入两个包
<script src="./lib/vue.js"></script>
<link rel="stylesheet" href="./lib/bootstrap.css">
添加数据的框
<div class="panel-heading">
<h3 class="panel-title">添加品牌</h3>
</div>
<div class="panel-body form-inline">
<label>
ID:
<input type="text" class="form-control" v-model="id">
</label>
<label>
Name:
<input type="text" class="form-control" v-model="name">
</label>
<!-- 在vue中使用绑定机制,为元素指定处理函数的时候,如果加了小括号,就可以给函数传参了 -->
<input type="button" value="添加" class="btn btn-primary" @click="add">
table表格
1.删除@click.prevent="del(item.id)" 点击事件
prevent阻止默认行为 item.id传的参数
2.搜索search方法传参数keywords
<table class="table table-bordered table-hover table-striped">
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Ctime</th>
<th>Operation</th>
</tr>
</thead>
<tbody>
<!-- 之前,v-for 中的数据,都是从 data 上的list 中直接渲染过来的
现在,我们自定义了一个 search 方法,同时,把 所有关键字,通过传参的形式,传递给了
search 方法 -->
<!-- 在search 方法内部,通过执行 for循环,把所有符合 搜索关键字的数据,保存到一个新数组中,
返回 -->
<tr v-for="item in search(keywords)" :key="item.id">
<td>{{ item.id }}</td>
<td>{{item.name}}</td>
<td>{{item.ctime}}</td>
<td>
<a href="" @click.prevent="del(item.id)">删除</a>
</td>
</tr>
</tbody>
</table>
data数据,以及methods方法
1.添加方法
分析:
1.获取到 id 和 name ,直接从 data 上面获取
2.组织出一个对象
3.把这个对象,调用 数组的相关方法,添加到 当前data 上的list 中
4.注意:在vue中,已经实现了数据的双向绑定,每当我们修改了data 中的数据,vue 会默认监听到数据的改动,自动把最新的数据,应用到页面上去;
5.当我们意识到上面的第四步的时候,就证明大家已经入门vue了,我们更多的是在进行 VM中Model 数据的操作,同时,在操作 Model 数据的时候,指定的业务逻辑操作
data: {
id: '',
name: '',
keywords: '', //所搜的关键字
list: [
{ id: 1, name: '奔驰', ctime: new Date() },
{ id: 2, name: '宝马', ctime: new Date() },
]
},
methods: {
add() {
var car = { id: this.id, name: this.name, ctime: new Date() }
this.list.push(car)
this.id = this.name = ''
}
}
2.删除方法
根据ID删除数据
分析:
1.如何根据ID,找到要删除在这一项的索引
2.如果找到索引了,直接调用 数组的 splice 方法
methods: {
del(id) {
// this.list.some((item,i)=>{
// if(item.id==id){
// this.list.splice(i,1);
// // 在数组的 some 方法中,如果return true ,就会立即终止这个数组的后续循环
// return true;
// }
// })
var index = this.list.findIndex(item => {
if (item.id == id) {
return true;
}
})
this.list.splice(index, 1);
}
}
3.数组过滤
filter和数组includes方法过滤
methods: {
search(keywords) {//根据关键字,进行数据的搜索
方法一
// var newList=[]
// this.list.forEach(item=>{
// if(item.name.indexOf(keywords) != -1) {
// newList.push(item)
// }
// })
// return newList
// 注意:forEach some filter findIndex 这些都属于数据的新方法
// 都会对数组中的每一项,进行遍历,执行相关的操作
方法二
return this.list.filter(item => {
// if(item.name.indexOf(keywords) !=-1)
// 注意:ES6中,为字符串提供了一个新方法,叫做 string.prototype.includes('要包含的字符串')
// 如果包含,则返回 true ,否则返回 false
if (item.name.includes(keywords)) {
return item
}
})
// return newList
}
}
过滤器
概念:Vue.js允许自定义过滤器,可被用作一些常见的文本格式化过滤器可以用在两个地方:插值表达式和v-bind表达式 过滤器应该被添加在JavaScript表达式的尾部,由“管道”符指示;
私有过滤器
1.HTML元素
<td>{{item.ctime | dateFormat()}}</td>
1.私有filters定义方式:
只能在 当前VM对象所控制的View区域进行使用
filters: {//定义私有过滤器 过滤器有两个条件 【过滤器名称 和 处理函数】
dateFormat: function (dateStr, pattern='') {
//在参数列表中 通过pattern=''来指定形参默认值,防止报错
//根据给定的时间字符串,得到特定的时间
var dt = new Date(dateStr)
// yyyy-mm-dd
var y = dt.getFullYear()
var m = (dt.getMonth() + 1).toString().padStart(2, '0')
var d = dt.getDate().toString().padStart(2, '0')
if (pattern.toLowerCase() === 'yyyy-mm-dd') {
return `${y}-${m}-${d}`
} else {
var hh = dt.getHours().toString().padStart(2, '0')
var mm = dt.getMinutes().toString().padStart(2, '0')
var ss = dt.getSeconds().toString().padStart(2, '0')
return `${y}-${m}-${d} ${hh}:${mm}:${ss} ~~~`
}
}
}
使用ES6中的字符串新方法 例:var d = dt.getDate().toString().padStart(2, '0') String.prototype.toString().padStart(maxLength,fillString='') 或String.prototype.toString().padEnd(maxLength,fillString='')来填充字符串
全局过滤器
// 全局过滤器,进行时间格式化
// 所谓的全局过滤器,就是所有的VM 实例都共享的
Vue.filter('dateFormat', function (dateStr, pattern = '') {
//根据给定的时间字符串,得到特定的时间
var dt = new Date(dateStr)
// yyyy-mm-dd
var y = dt.getFullYear()
var m = dt.getMonth() + 1
var d = dt.getDate()
// return y + '-' + m + '-' + d
if (pattern.toLowerCase() === 'yyyy-mm-dd') {
return `${y}-${m}-${d}`
} else {
var hh = dt.getHours()
var mm = dt.getMinutes()
var ss = dt.getSeconds()
return `${y}-${m}-${d} ${hh}:${mm}:${ss}`
}
})
过滤器调用的时候,采用的是就近原则,如果私有过滤器和全局过滤器名称一致,这个时候优先调用私有过滤器