vlambda博客
学习文章列表

Vue 前端知识汇总(二)

Vue过滤应用



需求 : 当我们输入表单就开始过滤查询过滤出包含字段的元素

1- 使用@change方法 这个方法 是鼠标失去焦点才开始触发

2- 使用@input方法    这个方法是只要value值改变才开始触发

根据我们的业务逻辑 该先择使用第二种方法 来完成我们的业务逻辑

<body> <div id="app">        <input type="text" @input="handleInput()"> <ul> <li v-for="item in dataList"> {{item}} </li> </ul> </div></body></html><script> new Vue({ el: '#app', data: { dataList: [ 'aaa', 'bbb', 'ccc', 'abc', 'ddd' ] }, methods: { handleInput(){ console.log('只要value改变就会触发这个方法') } }, })</script>




使用数据双向绑定 v-model 来绑定这个状态 

<input type="text" @input="handleInput()" v-model="mytext">
<script> new Vue({ el: '#app', data: { mytext:'', dataList: [ 'aaa', 'bbb', 'ccc', 'abc', 'ddd' ] }, methods: {            handleInput(){ console.log(this.mytext) } }, })</script>



使用 filter 方法过滤

下面我来写一个简单的小案例

使用filter方法遍历找出当前项大于  3  的数字

 var arr = [1,2,3,4,5] var newArr = arr.filter(item=>{ return item>3 }) console.log(newArr)// (2) [4, 5]

继续写我们的业务逻辑

 methods: { handleInput(){ var newList = this.dataList.filter(item=>item.indexOf(this.mytext)>-1)//使用indexOf判断元素是否存在 大于-1 过滤 存在的元素                 console.log(newList)//返回我们过滤出来的元素 } },




业务逻辑 : 将返回出过滤的数组替换原来的数组

将当前的数组等于我们的新数组不就好了吗

记住这种方法是不可行的

当我们每次dataList过滤时 都会对newList进行改变

 methods: { handleInput(){ var newList = this.dataList.filter(item=>item.indexOf(this.mytext)>-1)//使用indexOf判断元素是否存在 大于-1 过滤 存在的元素  //console.log(newList)//返回我们过滤出来的元素                this.dataList = newList  } },






现在我们有两种办法来满足我们当前的业务逻辑

1- 再声明一个数据 list 改变list的数组 当返回还是返回dataList  不提倡)

<script> new Vue({ el: '#app', data: { mytext:'', dataList: [ 'aaa', 'bbb', 'ccc', 'abc', 'ddd' ], list: [ 'aaa', 'bbb', 'ccc', 'abc', 'ddd' ] }, methods: { handleInput(){ var newList = this.list.filter(item=>item.indexOf(this.mytext)>-1)//使用indexOf判断元素是否存在 大于-1 过滤 存在的元素  // console.log(newList)                this.dataList=newList } }, })</script>

视频演示





2- 使用计算属性 (提倡该方法)

在我们使用 计算属性 结果一样 


<body> <div id="app"> <input type="text" v-model="mytext"> <ul> <!-- 改变后的dataList --> <li v-for="item in getDataList"> {{item}} </li> </ul> </div></body>
</html><script> new Vue({ el: '#app', data: { mytext:'', dataList: [ 'aaa', 'bbb', 'ccc', 'abc', 'ddd' ] }, computed: { getDataList(){ return this.dataList.filter(item=>item.indexOf(this.mytext)>-1) } },
})</script>






Vue中的事件冒泡

在我们的js中存在事件冒泡 当然vue中也存在


举例子说明

<body> <div id="app"> <ul @click=handleUlClick()> <li @click=handleLiClick()>111</li> <li>222</li> <li>333</li> </ul> </div></body></html><script>new Vue({ el:'#app', methods: { handleUlClick(){ console.log('ul的点击事件') }, handleLiClick(){ console.log('li的点击事件') } },})</script>

当我们点击111的时候 ul触发点击事件 再次点击222时 ul也触发事件

Vue 前端知识汇总(二)





阻止事件冒泡

在点击事件的方法后面加参数 $event 事件对象方法 点击111阻止ul冒泡


使用事件修饰符 @click.stop  同样可以阻止事件冒泡

使用事件修饰符 @click.self  只有点击ul才会触发这个方法

使用事件修饰符 @click.once  只执行一次

使用事件修饰符 @click.prevent  阻止a标签的默认行为

<body> <div id="app">        <ul @click=handleUlClick($event)> <li @click=handleLiClick($event)>111</li> <li>222</li> <li>333</li> </ul> <a href="https://www.baidu.com/" @click.prevent='handleChangePage()'>百度</a> </div></body>
</html><script> new Vue({ el: '#app', methods: {            handleUlClick(ev) { console.log(ev) console.log('ul的点击事件') }, handleLiClick(ev) { ev.stopPropagation(); console.log('li的点击事件')            }, handleChangePage(){ console.log('百度') } }, })</script>

Vue 前端知识汇总(二)





按键修饰符

当我们点击键盘的时候触发

使用事件修饰符 @click.enter  触发回车

使用事件修饰符 @click.键盘的键值/13回车键值  

<body> <div id="app">      <input type="text" @keyup.enter="handleKeup($event)">      <input type="text" @keyup.13="handleKeup($event)"> </div></body>
</html><script> new Vue({ el: '#app', methods: { handleKeup(ev){ console.log('回车触发') } }, })</script>

Vue 前端知识汇总(二)




数据双向绑定

<body> <div id="app"> <input type="text" v-model="text"> {{text}} </div></body>
</html><script> new Vue({ el: '#app', data:{ text:'' }, })</script>

Vue 前端知识汇总(二)





Vue购物车案例

案例需求  下载bootstrap  

在html中引入 bootstrap 样式

    <link rel="stylesheet" href="bootstrap-3.3.7-dist/css/bootstrap.min.css">


 <table class="table table-hover table-striped"> <thead> <tr> <th>ID</th> <th>Name</th> <th>NCtime</th> <th>Operation</th> </tr> </thead> <tbody> <tr> <td></td> </tr> </tbody>        </table>

创建假数据

<script> new Vue({ el: '#app', data: { list: [{ id: 1, name: '奔驰', ctime: new Date() }, { id: 2, name: '宝马', ctime: new Date() }, { id: 3, name: '玛莎拉蒂', ctime: new Date() }, ] }, methods: {
}, })</script>

将数据展现到网页中

 <table class="table table-bordered table-hover table-striped"> <thead> <tr> <th>ID</th> <th>Name</th> <th>NCtime</th> <th>Operation</th> </tr> </thead> <tbody> <tr v-for="item in list" :key="item.id"> <td>{{item.id}}</td> <td>{{item.name}}</td> <td>{{item.ctime}}</td> <td> <a href="#">删除</a> </td> </tr> </tbody>        </table>

 

Vue 前端知识汇总(二)





开始写 添加功能

 <div class="panel panel-primary"> <div class="panel-heading"> <h3 class="panel-title">添加品牌</h3> </div> <div class="panel-body form-inline"> <label> ID <input type="text" class="form-control"> </label> <label> Name <input type="text" class="form-control"> </label> <label> <input type="button" value="添加" class="btn btn-primary"> </label>
</div> </div>

Vue 前端知识汇总(二)

基本样式完成




给所需要的添加元素  添加事件

<input type="text" class="form-control" v-model="id">

<input type="text" class="form-control" v-model="name">

 在vue中 使用事件绑定机制 为元素指定处理函数的时候 如果加了小括号 就可以给函数传参

<input type="button" value="添加" class="btn btn-primary" @click="add()">


添加功能 业务逻辑

1- 获取到ID /Name 直接从data上面获取

2- 组织一个对象


3- 把这个对象 调用数组的相关方法 添加到当前data中的list

注意 : 在Vue中 已经实现了数据双向绑定 每当我们修改了data中的数据 Vue会默认监听到数据的改动 自动的把最新的数据 应用到页面中

完成这三部业务逻辑

 data: { <a href="#" @click.prevent="del(item.id)">删除</a>            id: '',//id为空 name: '',//name为空 list: [{ id: 1, name: '奔驰', ctime: new Date() }, { id: 2, name: '宝马', ctime: new Date() }, { id: 3, name: '玛莎拉蒂', ctime: new Date() }, ] }, methods: {            add() {  var car = {id: this.id, name: this.name,ctime: new Date()} this.list.push(car) } }

Vue 前端知识汇总(二)

添加完之后 清空输入框的字

this.id=this.name='' 在后面直赋值为 ‘ ’ 




给所需要的删除元素  添加事件

删除功能  要删除的是item.id  将它作为参数放到删除事件中

<a href="#" @click.prevent="del(item.id)">删除</a>


删除业务 业务逻辑

1如何根据id找到要删除这样一项的索引

2-  如果找到索引 直接调用数组的 splice 方法


删除方法   有两种方法

1- 使用some方法 

定义和用法

some() 方法用于检测数组中的元素是否满足指定条件(函数提供)。

some() 方法会依次执行数组的每个元素:

  • > 如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测。

  • > 如果没有满足条件的元素,则返回false。

注意: some() 不会对空数组进行检测。

注意: some() 不会改变原始数组。

 del(id) {  this.list.some((item, i) => { if (item.id == id) { this.list.splice(i, 1)            // 在数组的some 方法中 如果return true  就会立即终止数组的后续循环 return true } })}


1- 使用findIndex方法 直接找到index

定义和用法

findIndex() 方法返回传入一个测试条件(函数)符合条件的数组第一个元素位置。

findIndex() 方法为数组中的每个元素都调用一次函数执行:

  • > 当数组中的元素在测试条件时返回 true 时, findIndex() 返回符合条件的元素的索引位置,之后的值不会再调用执行函数。

  • > 如果没有符合条件的元素返回 -1

注意: findIndex() 对于空数组,函数是不会执行的。

注意: findIndex() 并没有改变数组的原始值

del(id) {  var index = this.list.findIndex(item => { if (item.id == id) {            return true } })     console.log(index)}


直接调用index同样可以删除

this.list.splice(index,1)




搜索 功能样式


样式    添加标签

 <label>      搜索关键字: <input type="text" class="form-control" v-model="keywords">  </label>

  及在data中定义双向绑定

  keywords:'',   //搜索关键字


Vue 前端知识汇总(二)





搜索关键字 功能业务逻辑

1- 之前 v-for 中的数据 都是直接从data上的list 直接渲染过来的 现在我们定义了一个search方法 同时把搜索的关键字通过参数传递过来

2- 在search 方法内部 通过执行for循环 把符合搜索的关键字返回到新数组中 返回


搜索方法   有两种方法

1- 使用forEach方法 来遍历数组

search(keywords) {     var newList = []     this.list.forEach(item => {     if (item.name.indexOf(keywords) > -1) {        newList.push(item)    }  })      return newList}

2- 使用filter方法 来遍历数组

includes() 方法用来判断一个数组是否包含一个指定的值,如果是返回 true,否则false。

直接将结果return 


 return this.list.filter(item => { if (item.name.includes(keywords)) {             return item        }  })



视频演示




codekrist