需求:在输入框里输入内容,包含相关内容的值被筛选出来;
图示:

最初的代码:
- <div id="box">
- <input type="text" @input="handleInput()" v-model="mytext">
- <ul>
- <li v-for="item in datalist" :key="item">
- {{item}}
- li>
- ul>
- div>
- <script>
- new Vue({
- el:"#box",
- data:{
- mytext:"",
- datalist:["aaa","add","bbb","bbc","ccc","ddd","abd"]
- },
- methods:{
- handleInput(){
- console.log("input",this.mytext)
- this.datalist=this.datalist.filter(item=>item.includes(this.mytext))//筛选出来包含输入框值的元素
- //然后赋值给原数组,因为filter不会改变原数组,所以要用赋值的办法使得原数组改变,进而改变dom
- }
- }
- })
- script>
- body>
v-model的使用:
filter的用法:
- filter(function(){
- return 判断条件
- })
includes方法:
覆盖原数组的原因:

为什么要重新赋值一个数组originList:
因为如果按照下面这个方法:
![]()
结果是,当你输入一个“a”,筛选出来了包含a的元素,然后数组就改变成只包含a的元素的值了,比如数组变为["aaa","add",'abd"],然后下一次想在数组上去查其他的元素,比如查“c”相关的元素,就查不到了,因为原数组已经被改变了,回不去了。所以这就有问题了,因为我们想每次都在原数组的基础上进行查。 有几种解决办法:
(1)方法一:上面那个复制一个新的数组出来,每次在新数组上查询,再赋值给datalist数组进行显示,这样新数组始终是不会改变的,所以这样就能保证我们每次查询都是在完整的数组上查询的。 代码见:(在原来的代码中更改的部分)

结果:
(2) 方法二:定义一个函数表达式,通过返回筛选后的结果,重新让li遍历
- <div id="box">
- <input type="text" v-model="mytext">
- <ul>
- <li v-for="item in test()" :key="item">
- {{item}}
- li>
- ul>
-
-
- div>
- <script>
- new Vue({
- el:"#box",
- data:{
- mytext:"",
- datalist:["aaa","add","bbb","bbc","ccc","ddd","abd"],
- },
- methods:{
- test(){
- return this.datalist.filter(item=>item.includes(this.mytext))
- }
- }
- })
- script>
- body>

