基于Vuejs的搜索匹配功能实现方法


Posted in Javascript onMarch 03, 2018

最近一直在看vue,查了很多资料,看了很多文档和博客,大概半知半解了,然后利用所理解的知识写了一个简单的搜索匹配功能。

大概长这个样子:

基于Vuejs的搜索匹配功能实现方法

数据都是假的

代码部分

(注意我引用的是本地vue.min.js文件,请注意文件路径。)

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Vue测试2</title>
    <script type="text/javascript" src="vue.min.js"></script>
    <style type="text/css">
      *{
        padding: 0;
        margin: 0;
        font-size: 14px;
        font-family: "微软雅黑";
      }
      #box{
        width: 500px;
        height: auto;
        border: 1px solid #ccc;
        margin: 50px auto;
        padding: 10px;
      }
      .search{
        width: 480px;
        height: 100px;
        text-align: center;
      }
      .searchBox{
        width: 230px;
        height: 40px;
        outline: none;
        text-indent: 10px;
        margin-right: 20px;
      }
      .btn{
        width: 100px;
        height: 50px;
        cursor: pointer;
        font-size: 18px;
      }
      .goodsheet{
        width: 500px;
        height: auto;
        border: 1px solid #eee;
      }
      .goodsheet tr td,
      .goodsheet tr th{
        width: 33%;
        border: 1px solid #eee;
        padding: 5px 10px;
        text-align: left;
      }
      .goodsheet tr th span{
        background: #ff9900;
        padding: 0 6px;
        color: #fff;
        cursor: pointer;
      }
    </style>
  </head>
  <body>
    <div id="box">
      <div class="search">
        <input type="text" class="searchBox" v-model="searchVal">
        <button class="btn">搜 索</button>
      </div>
      <table class="goodsheet">
        <tr>
          <th>商品名</th>
          <th>单价
            <span @click="orderFn('price', false)">↑</span>
            <span @click="orderFn('price', true)">↓</span>
          </th>
          <th>销量
            <span @click="orderFn('sales', false)">↑</span>
            <span @click="orderFn('sales', true)">↓</span>
          </th>
        </tr>
        <tr v-for='(item, key) in list'>
          <td>{{item.name}}</td>
          <td>{{item.price}}</td>
          <td>{{item.sales}}万</td>
        </tr>
      </table>
    </div>
    <script type="text/javascript">
      var myVueTest = new Vue({
        el:'#box',
        data:{
          goodsList:[
            //假数据
            {name:"三星Galaxy Note8",price:5200,sales:2.6},
            {name:"iphone5s",price:2500,sales:2.2},
            {name:"iphone6",price:2800,sales:1.6},
            {name:"iphone6s",price:3200,sales:2.9},
            {name:"iphone7",price:3800,sales:12.6},
            {name:"iphone7plus",price:4200,sales:2.1},
            {name:"iphone8",price:5500,sales:10.6},
            {name:"华为",price:4600,sales:7.6},
            {name:"小米",price:1200,sales:32.6},
            {name:"OPPOR11",price:3000,sales:1.2},
            {name:"vivoX20",price:3250,sales:2.9}
          ],
          searchVal:'',  //默认输入为空
          letter:'',    //默认不排序
          original:false  //默认从小到大排列
        },
        methods:{
          orderFn(letter,original){
            this.letter = letter;    //排序字段 price or sales 
            this.original = original;  //排序方式 up or down
          }
        },
        //通过计算属性过滤数据
        computed:{
          list: function(){
            var _this = this;
            //逻辑-->根据input的value值筛选goodsList中的数据
            var arrByZM = [];//声明一个空数组来存放数据
            for (var i=0;i<this.goodsList.length;i++){
              //for循环数据中的每一项(根据name值)
              if(this.goodsList[i].name.search(this.searchVal) != -1){
                //判断输入框中的值是否可以匹配到数据,如果匹配成功
                arrByZM.push(this.goodsList[i]);
                //向空数组中添加数据
              }
            }
            //逻辑-->升序降序排列 false: 默认从小到大 true:默认从大到小
            //判断,如果要letter不为空,说明要进行排序
            if(this.letter != ''){
              arrByZM.sort(function( a , b){
                if(_this.original){
                  return b[_this.letter] - a[_this.letter];
                }else{
                  return a[_this.letter] - b[_this.letter];
                }
              });
            }
            //一定要记得返回筛选后的数据
            return arrByZM;
          }
        }
      });
    </script>
  </body>
</html>

其实核心算法还是用原生JS写的,vue提供了很强大的数据绑定方法,但是如果只知道vue这个框架,没有自己的核心思想的话,还是没多大用处的,所以作者在官方文档里面说希望我们是有一定JS基础的。我还是觉得前端框架再多,最厉害的永远是原生JS。

以上这篇基于Vuejs的搜索匹配功能实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
学习YUI.Ext 第六天--关于树TreePanel(Part 1)
Mar 10 Javascript
对YUI扩展的Gird组件 Part-1
Mar 10 Javascript
jQuery 移动端artEditor富文本编辑器
Jan 11 Javascript
jQuery实现带水平滑杆的焦点图动画插件
Mar 08 Javascript
JS类的定义与使用方法深入探索
Nov 26 Javascript
jQuery使用ajax方法解析返回的json数据功能示例
Jan 10 Javascript
Vue 2.x教程之基础API
Mar 06 Javascript
AngularJS读取JSON及XML文件的方法示例
May 25 Javascript
vue 中swiper的使用教程
May 22 Javascript
vue与bootstrap实现简单用户信息添加删除功能
Feb 15 Javascript
Vue 通过公共字段,拼接两个对象数组的实例
Nov 07 Javascript
详解vuejs中执行npm run dev出现页面cannot GET/问题
Apr 26 Javascript
vue.js select下拉框绑定和取值方法
Mar 03 #Javascript
Vuejs在v-for中,利用index来对第一项添加class的方法
Mar 03 #Javascript
基于vue v-for 循环复选框-默认勾选第一个的实现方法
Mar 03 #Javascript
JS表单传值和URL编码转换
Mar 03 #Javascript
jQuery实现左右滑动的toggle方法
Mar 03 #jQuery
vue中实现移动端的scroll滚动方法
Mar 03 #Javascript
vue.js-div滚动条隐藏但有滚动效果的实现方法
Mar 03 #Javascript
You might like
php截取utf-8中文字符串乱码的解决方法
2010/03/29 PHP
php中时间轴开发(刚刚、5分钟前、昨天10:23等)
2011/10/03 PHP
php数组函数序列之array_unshift() 在数组开头插入一个或多个元素
2011/11/07 PHP
php实现上传图片生成缩略图示例
2014/04/13 PHP
php中Y2K38的漏洞解决方法实例分析
2014/09/22 PHP
PHP 使用redis简单示例分享
2015/03/05 PHP
Thinkphp5框架使用validate实现验证功能的方法
2019/08/27 PHP
jQuery中add实现同时选择两个id对象
2010/10/22 Javascript
jQuery中调用WebService方法小结
2011/03/28 Javascript
JavaScript初学者应注意的七个细节小结
2012/01/30 Javascript
早该知道的7个JavaScript技巧
2013/03/27 Javascript
Ext JS 4实现带week(星期)的日期选择控件(实战一)
2013/08/21 Javascript
Js数组排序函数sort()介绍
2015/06/08 Javascript
AngularJS自定义控件实例详解
2016/12/13 Javascript
怎么使用javascript深度拷贝一个数组
2019/06/06 Javascript
Openlayers实现地图的基本操作
2020/09/28 Javascript
举例详解Python中的split()函数的使用方法
2015/04/07 Python
举例讲解Python面相对象编程中对象的属性与类的方法
2016/01/19 Python
python如何实现int函数的方法示例
2018/02/19 Python
python添加菜单图文讲解
2019/06/04 Python
Django多数据库的实现过程详解
2019/08/01 Python
一文轻松掌握python语言命名规范规则
2020/06/18 Python
Python+pyftpdlib实现局域网文件互传
2020/08/24 Python
python实现AdaBoost算法的示例
2020/10/03 Python
python基于socket模拟实现ssh远程执行命令
2020/12/05 Python
Python扫描端口的实现
2021/01/25 Python
CSS3+DIV实现漂亮的动画彩色标签
2016/06/16 HTML / CSS
详解CSS3+JS完美实现放大镜模式
2020/12/03 HTML / CSS
芬兰设计商店美国:Finnish Design Shop US
2019/03/25 全球购物
业务部门经理岗位职责
2014/02/23 职场文书
个人投资合作协议书
2014/10/12 职场文书
全国助残日活动总结
2015/05/11 职场文书
2015年行政人事工作总结
2015/05/21 职场文书
社区志愿者服务心得体会
2016/01/22 职场文书
环境保护宣传标语大全!
2019/06/28 职场文书
Window server中安装Redis的超详细教程
2021/11/17 Redis