Vue-搜索框实现

2023-10-30

                                           热爱生活!  热爱技术!热于分享!

一.方法分析

1.字符串匹配(BF算法 KMP算法 库函数indexOf均可实现)

2.v-for循环实时更新元素

3.@click=""实现点击后页面的跳转同时设置不同id来根据内容的不同来跳转到不同页面

二.代码分析:

html代码:

1.设置v-model绑定元素内容

2.goPage(data.id) 写一个函数来根据id不同跳转界面

<div class="container" id="div1">
    <div class="search bar1">
        <form>
            <input type="text" v-model="inputText" placeholder="请输入您要搜索的内容...">
           <button type="submit" @click="Click()"></button>
            <table border="1" cellspacing="0">
                <table>
                <li v-for="data in newDatalist" @click="goPage(data.id)">
                    {{data.content}}
                </li>
                </table>
            </table>
        </form>
    </div>

JS-Vue代码:

1.dataList[]保存原始数据

2.newDataList[]用于搜索下拉列表的内容的呈现

<script>
    var vm=new Vue({
        el:"#div1",//绑定id对象
        data:{//定义属性对象
            id:'',
            content:'',
            inputText:"",//初始化为空
            datalist:[
                {id:'1',content:"热爱计算机"},
                {id:'2',content:"热爱数据结构"},
                {id:'3',content:"热爱生活"},
                {id:'4',content:"腾讯"},
                {id:'5',content:"大家好!Good morning!"},
                {id:'6',content:"oy is studying very hard"},
                {id:'7',content:"Tencent oye!"},
                {id:'8',content:"好好学习"},
                {id:'9',content:"好好吃饭"},
                {id:'10',content:"好好运动"},
                {id:'11',content:"好好做人"},
                {id:'12',content:"赶紧好好写AI方案"}],	//原始数据
            newDatalist:[]
        },
        methods:{
            showData(val){
                let array=val.split(this.keyword);
                val=array.join('<font color="red">'+this.keyword+'</font>');
                return val;
            },
            goPage:function(id){
               if(id==='4'||id==='7'){
                   window.open("https://www.tencent.com/");
               }
               else if(id==='12'){window.open("https://www.paddlepaddle.org.cn/");}
               else {window.open("https://www.baidu.com");}
            },
            Click(){
                
                if(this.inputText==="数据结构")
                {
                    window.open("https://blog.csdn.net/rainchxy/article/details/79454465");
                }
                else {
                    window.open("https://www.baidu.com");
                }
            }
        },
        watch:{//监听输入框的变化
            inputText:function(newText){
                if(newText.length>0){
                    this.newDatalist.splice(0,this.newDatalist.length);//清空之前数组
                    for(let value of this.datalist){
                        if(value.content.indexOf(newText)>-1){// 可以直接用indexOf(属性)
                            this.newDatalist.push({
                                id: value.id,
                                content :value.content
                            });//一定要加this

                        }
                    }
                }else{
                    this.newDatalist=[];//输入框为空,等于原始数据
                }
            }
        },
    });
</script>

完整源码: 


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Research Engine</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <link href="http://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">
    <style>
        * {
            box-sizing: border-box;
        }
        body {
            text-align: center;
            margin: 0;
            padding: 0;
            background: #494A5F;
            font-weight: 500;
            font-family: "Microsoft YaHei","宋体","Segoe UI", "Lucida Grande", Helvetica, Arial,sans-serif, FreeSans, Arimo;
        }
        .container {
            margin-top:200px;
            margin-left:380px;
            width: 500px;
            height: 820px;
        }
        div.search {padding: 30px 0;}
        form {
            position: relative;
            width: 300px;
            margin: 0 auto;
        }
        input, button {
            border: none;
            outline: none;
        }
        input {
            width: 100%;
            height: 42px;
            padding-left: 13px;
        }
        button {
            height: 42px;
            width: 42px;
            cursor:pointer;
            position: absolute;
        }
        /*搜索框1*/
        .bar1 {background: #A3D0C3; }
        .bar1 input {
            border: 2px solid #7BA7AB;
            border-radius: 5px;
            background: #F9F0DA;
            color: #9E9C9C;
        }
        .bar1 button {
            top: 0;
            right: 0;
            background: #7BA7AB;
            border-radius: 0 5px 5px 0;
        }
        .bar1 button:before {
            content: "\f002";
            font-family: FontAwesome,serif;
            font-size: 16px;
            color: #F9F0DA;
        }
        li{
            text-align: left;
            width:100%;
            background: #F9F0DA;
            list-style: none;
        }
        li:hover{
            background: #666666;
        }
        a{
            text-decoration: none;
            color:black;
        }

    </style>
</head>
<body>
<div class="container" id="div1">
    <div class="search bar1">
        <form>
            <input type="text" v-model="inputText" placeholder="请输入您要搜索的内容...">
            <button type="submit" @click="new Click()"></button>
            <table border="1" cellspacing="0">
                <table>
                    <li v-for="data in newDatalist" @click="goPage(data.id)">
                        {{data.content}}
                    </li>
                </table>
            </table>
        </form>
    </div>
    <script>
        var vm=new Vue({
            el:"#div1",//绑定id对象
            data:{//定义属性对象
                id:'',
                content:'',
                inputText:"",//初始化为空
                datalist:[
                    {id:'1',content:"热爱计算机"},
                    {id:'2',content:"热爱数据结构"},
                    {id:'3',content:"热爱生活"},
                    {id:'4',content:"腾讯"},
                    {id:'5',content:"大家好!Good morning!"},
                    {id:'6',content:"oy is studying very hard"},
                    {id:'7',content:"Tencent oye!"},
                    {id:'8',content:"好好学习"},
                    {id:'9',content:"好好吃饭"},
                    {id:'10',content:"好好运动"},
                    {id:'11',content:"好好做人"},
                    {id:'12',content:"赶紧好好写AI方案"}],	//原始数据
                newDatalist:[]
            },
            methods:{
                showData(val){
                    let array=val.split(this.keyword);
                    val=array.join('<font color="red">'+this.keyword+'</font>');
                    return val;
                },
                goPage:function(id){
                    if(id==='4'||id==='7'){
                        window.open("https://www.tencent.com/");
                    }
                    else if(id==='12'){window.open("https://www.paddlepaddle.org.cn/");}
                    else {window.open("https://www.baidu.com");}
                },
                Click(){
                    if(this.inputText==="数据结构")
                    {
                        window.open("https://blog.csdn.net/rainchxy/article/details/79454465");
                    }
                    else {
                        window.open("https://www.baidu.com");
                    }
                }
            },
            watch:{//监听输入框的变化
                inputText:function(newText){
                    function next(str) {
                        var prefix = [];
                        var suffix = [];
                        var partMatch;
                        var i = str.length
                        var newStr = str.substring(0, i + 1);
                        for (var k = 0; k < i; k++) {
                            //取前缀
                            prefix[k] = newStr.slice(0, k + 1);
                            suffix[k] = newStr.slice(-k - 1);
                            if (prefix[k] === suffix[k]) {
                                partMatch = prefix[k].length;
                            }
                        }
                        if (!partMatch) {
                            partMatch = 0;
                        }
                        return partMatch;
                    }
                    function KMP(sourceStr, searchStr) {
                        var sourceLength = sourceStr.length;
                        var searchLength = searchStr.length;
                        var result;
                        var i = 0;
                        var j = 0;
                        for (; i < sourceStr.length; i++) { //最外层循环,主串
                            //子循环
                            for (var j = 0; j < searchLength; j++) {
                                //如果与主串匹配
                                if (searchStr.charAt(j) === sourceStr.charAt(i)) {
                                    //如果是匹配完成
                                    if (j === searchLength - 1) {
                                        result = i - j;
                                        break;
                                    } else {
                                        //如果匹配到了,就继续循环,i++是用来增加主串的下标位
                                        i++;
                                    }
                                } else {
                                    if (j > 1) {
                                        i += i - next(searchStr.slice(0, j));
                                    } else {
                                        //移动一位
                                        i = (i - j)
                                    }
                                    break;
                                }
                            }
                            if (result || result === 0) {
                                break;
                            }
                        }
                        if (result || result === 0) {
                            return result
                        } else {
                            return -1;
                        }
                    }
                    function BF(sourceStr,searchStr){
                       var i=0;
                       var j=0;
                       var start=0;
                       while(i<sourceStr.length&&j<searchStr.length)
                       {
                           if(sourceStr[i]===searchStr[j])
                           {
                               i++;
                               j++;
                           }
                           else{
                               start++;
                               i=start;
                               j=0;
                           }
                       }
                       if(j===searchStr.length){return start+1;}
                       else{return -1;}
                    }
                    if(newText.length>0){
                        this.newDatalist.splice(0,this.newDatalist.length);//清空之前数组
                        for(let value of this.datalist){
                            if(KMP(value.content,newText)>-1){// 可以直接用indexOf(属性)
                                this.newDatalist.push({
                                    id: value.id,
                                    content :value.content
                                });//一定要加this

                            }
                        }
                    }else{
                        this.newDatalist=[];//输入框为空,等于原始数据
                    }
                }
            },
        });
    </script>
</body>
</html>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue-搜索框实现 的相关文章

  • 无法在地图循环中访问 Axios 调用的值

    我有一个 javascript 对象 其 ID 对应于一组画廊 我使用地图循环遍历它 在每个循环中 我都会进行 axios 调用来获取当前 id 的图库 最后 我需要一个包含所有画廊内容的数组 问题是地图循环完成后我无法访问数据 当我 co
  • html 链接不起作用 href javascript 参数太长

    a href alt a 在 href 中我调用了一个 javascript 函数 change 第二个参数 n1387519869249 1196 n1387519906965 1368 n 是一个非常长的值 大约 5070 个字符 但在
  • zone.js:140未捕获类型错误:无法读取属性“删除”

    我是 kendo ui 的新手 我在小提琴中开发了原型 删除确认窗口在那里工作正常 但是当我集成到我的代码库中时 我收到错误 Cannot read property remove at the line pai to delete rem
  • 为什么 useReducer 调度会导致重新渲染?

    假设我实现一个简单的全局加载状态 如下所示 hooks useLoading js import React createContext useContext useReducer from react const Context crea
  • JavaScript 画布内存问题

    我在用着getImageData putImageData在 HTML5 画布上能够操作图片 我的问题是浏览器似乎从来没有释放任何内存 http jonelf posterous com lite gc men for sent 直到我关闭
  • querySelector 搜索直接子级[重复]

    这个问题在这里已经有答案了 我有一些类似 jquery 的函数 function elem return gt someselector elem 问题是我怎样才能做同样的事情querySelector 问题是 gt 选择器中querySe
  • 使用 babel env 预设时,展开运算符出现语法错误

    我正在努力 现代化 meern io 入门样板 https github com Hashnode mern starter通过替换巴别塔es2015 and stage 0预设为env 然而 似乎env预设无法识别以下片段client m
  • 解释一下这个令人困惑的 dojo 教程声明语法

    我正在阅读使用的语法道场的声明 http dojotoolkit org documentation tutorials 1 8 declare 用于班级创建 描述很混乱 The declare function is defined in
  • 如何在 Windows 网络中的 Intranet Web 应用程序中获取用户的用户名

    我内部有一个简单的 HTML 页面 它只显示一个表单并要求用户填写 我想自动捕获Windows域用户名和机器名 并将其与表单中收集的数据一起提交 我可以在客户端这样做吗 HTML JavaScript 或者我被迫在服务器端执行此操作 我还不
  • 无需重定向的 HTML 页面提交

    有没有什么方法可以在不使用ajax的情况下提交html表单而无需从当前页面重定向 你可以设置一个target 为您form 这样您就可以将表单提交到新选项卡 target blank 或一个小的 隐藏的iframe target nameo
  • 如何使用 github 托管外部 CSS 文件?

    我将 css 上传到 github 然后转到网站上的文件并单击 raw 选项 我尝试将其添加到网页中 但 chrome 给出以下错误 资源解释为样式表 但使用 MIME 类型 text plain 进行传输 https raw github
  • 公开闭包内的方法

    当我们在闭包内创建一个方法时 该方法将成为该闭包的私有方法 并且在我们以某种方式公开它之前无法访问它 怎么可能暴露呢 您可以返回对它的引用 var a function var b function I m private alert go
  • 在给定索引上将字符串分成两部分并返回两部分

    我有一个字符串 需要在给定索引上拆分 然后返回两个部分 并用逗号分隔 例如 string 8211 8 211 98700 98 700 因此 我需要能够在任何给定索引上拆分字符串 然后返回字符串的两半 内置方法似乎执行分割 但只返回分割的
  • 为什么这个递归函数返回未定义?

    我正在尝试编写一个使用递归组合两个字符串的函数 我的代码如下 但我不知道为什么该函数返回未定义 特别是当我在基本情况下使用 console log 时 它不会打印未定义而是打印正确的值 var str3 function merge str
  • 是否有跨浏览器的方式在Javascript中设置style.float?

    通常 如果您需要在 JavaScript 中设置样式属性 您可以这样说 element style attribute value 虽然略有不同 但属性名称通常与 HTML 属性名称类似 尽管是驼峰式 对我来说问题是 float 属性不起作
  • 等待异步 grunt 任务完成

    我收到了 grunt 设置 其中一个新任务应该执行 grunt task run 已经存在的任务 要执行的任务是异步的 新任务应该等待异步任务完成 执行此操作的首选方法是什么 grunt 已经涵盖了这一点 你应该将你的任务声明为异步任务 并
  • 为什么 console.log() polyfill 不使用 Function.apply()?

    我一直在看一些流行的console log 包装 填充 保罗 爱尔兰的 http paulirish com 2009 log a lightweight wrapper for consolelog 本阿尔曼的 http benalman
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • eventSources 到事件 Json,完整日历

    我正在尝试从 eventSources 获取 json 调用到我的事件 我在 eventSources 中返回的 json 是 title Title Test start 1305841052 当我将此字符串传递到事件中时 它会正确显示日
  • 拉斐尔路径交叉点不起作用

    我对拉斐尔和 pathIntersection method JSFiddle 示例 http jsfiddle net t6gWt 2 您可以看到有两条线都与曲线相交 但当我使用 pathIntersection method 有一个未解

随机推荐

  • python版本onnx模型多输入

    onnx模型有两个输出的情况 import onnxruntime def use onnx model model path session onnxruntime InferenceSession model path enable c
  • node+express 获取微信小程序的session_key和openid

    前言 使用node来写一个服务接口 接收前段的code 然后返回微信小程序的session key和openid 注意 小程序的appId必须是企业认证的 个人认证的无法通过 wx login 会报错 步骤 1 安装插件 request c
  • 下列软件包有未满足的依赖关系: python-catkin-pkg : 依赖: python-catkin-pkg-modules (>= 0.5.2) 但是它将不会被安装

    您也许需要运行 apt fix broken install 来修正上面的错误 下列软件包有未满足的依赖关系 python catkin pkg 依赖 python catkin pkg modules gt 0 5 2 但是它将不会被安装
  • 软件测评中心测试项目及测试过程简析,CMA、CNAS软件测试报告获取

    软件测试是产品周期中必不可少的一步 可以更好的保障软件质量 那么我们所知的软件测评中心一般有哪些测试项目以及测试流程是如何 和小编一起往下看看吧 一 软件测评中心的测试项目 1 功能测试 通过模拟用户使用场景 测试软件的各项功能是否正常 稳
  • 带你轻松理解python类的一些基础用法(❁´◡`❁)

    总结一下前一段时间的学习成果 将我对知识点的简易理解方法分享给大家 大家可以参考着学习 希望对你们学习python有帮助 使用继承开发程序 用子类继承父类 首先我们先创建一个父类 大家可以将我们的这个父类理解为 就是外面最大的一个类 他的里
  • How YouPorn Uses Redis: SFW Edition

    I interviewed Eric Pickup IT Lead at the Manwin group the company behind sites like YouPorn and Pornhub to tell us about
  • element-ui 点击dialog右上角关闭图标不关闭的问题

    网上一些人说不起效是因为 visible 属性没有添加 sync 修饰符 一般情况下是因为一个 before close 属性 这个是关闭前的回调 会暂停dialog的关闭 该回调接收一个 done 函数作为参数 必须在回调里执行 done
  • ue先视频教程后深入

    入职后 发现让我搞cesium for unreal 其他人不会 幸亏我以前跌跌撞撞地运行过 第二遍进行起来就熟能生巧了 然后进行了和mysql的结合 我发现 还是先搞视频教程 再深入 有先有后 学了不会白学 后深入的原因是 有的同事搞视频
  • 图片文本linux,Tesseract: 从图片提取文本

    经常遇到同事要求排查故障 但却提供截图而不出示文本信息 为此 我考虑用 OCR Optical Character Recognition 光学字符识别 技术从截图中将文本提取出来 通过试用和比较 我感觉 Tesseract 还不错 故在此
  • Games101,作业7(多线程提速)

    多线程 多线程的相关信息可根据我的另一个blog查看 多线程处理提速方式 将像素width height分隔为多份 每一份交给一个线程处理 分隔方式有 网格分隔 代码中使用了这种分隔方式 条形分隔 每一列 或 每一行 为一个线程 更利于编程
  • 基于Java的航空售票管理系统

    源码下载 http www byamd xyz hui zong 1 摘 要 本课题设计的是航空购票管理系统 本系统主要设计了三个类 分别是Infor类 gongneng类和测试 Test 类 在Infor类里面主要定义了数组 分别是nam
  • 【解决】Python——Max retries exceeded with url: (Caused by NewConnectionError(‘<urllib3.connection

    HTTPConnectionPool host yzw zjnu edu cn port 80 Max retries exceeded with url Caused by NewConnectionError
  • C++Primer Section 2-1

    Section 2 1 Primitive Built in Types Section 2 1 1 Arithmetic Types Differences in Integer Types Differences between cha
  • 如何读懂别人写的vc++代码

    每个人的编程习惯各异规范程度 命名规则 使用习惯也不尽相同 有人爱用Timer 有的人用线程 有的人用PostMessage有的人用SetEvent或回调或直接调用 所以别人的程序也是良莠不齐 所以要求你对编程基础 程序构架 业务规则都要有
  • 95-34-035-Context-HeadContext和TailContext

    文章目录 1 概述 2 继承体系 3 HeadContext 3 1 类签名 4 TailContext 1 概述 HeadContext和TailContext使用继承的方式关联Handler 作为ChannelPipeline双向链表的
  • Sort()函数用法:比较函数写法

    sort 函数 sort函数可以三个参数也可以两个参数 必须包含头文件 include lt algorithm gt using namespace std 它使用的排序方法是类似于快排的方法 时间复杂度为o nlog n Sort函数有
  • 微信开发 "errcode":-1 应该怎么办

    相信不少朋友在微信开发的时候遇到了 string errcode 1 errmsg system error length 38 这个时候并不是你的代码有问题 你只需要将你的PHP文件的编码改成utf 8即可 不知道如何操作的朋友 可以按照
  • Java 前后端分离业务封装 对后端返回值进行封装 PageVO封装

    遇到前后端业务需要不一致时对Controller返回结果进行封装 后端返回结果 前后端分离后 web 端要求结果 counts 2694 pagesize 14 pages 8 page 66 items id 9009384 title
  • qtcpsocket类read函数接收大数据_一篇易懂的CAN 通讯功能实现指南2--READ

    通过一篇易懂的CAN通讯协议指南1 我们知道 CAN总线的2种架构 高速CAN和低速CAN CAN协议帧类型 数据帧 遥控帧 错误帧 过载帧 线与机制 仲裁机制 位定时与同步 以上基础的应用多数体现在硬件处理部分 所以只有少数体现在软件部分
  • Vue-搜索框实现

    热爱生活 热爱技术 热于分享 一 方法分析 1 字符串匹配 BF算法 KMP算法 库函数indexOf均可实现 2 v for循环实时更新元素 3 click 实现点击后页面的跳转同时设置不同id来根据内容的不同来跳转到不同页面 二 代码分