热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

vue实现搜索框搜索新增_Vue2.0组件实现动态搜索引擎(一)

从github上看到一个不错的开源项目:https:github.comlavyunvue-demo-search,自己琢磨着不看代码做了一遍学习了不少

从github上看到一个不错的开源项目:https://github.com/lavyun/vue-demo-search,

自己琢磨着不看代码做了一遍学习了不少,现将碰到的坑与填坑过程分享出来。

首先看一下demo的界面:

简单来说就是一个复刻各大搜索引擎的功能,用户输入关键字能出现搜索建议并上下键控制输入框内容。

同时点击上方logo能够切换不同引擎,点击搜一下能跳转到对应网站搜索结果。

首先分析一下页面,基本由2个部分组成:上方的LOGO部分和下方的输入框与搜索建议弹框。

由于篇幅关系,这次先分析logo部分的实现代码。

基于这次练习是针对Vue组件,所以我们可以将其拆分为logo组件和搜索组件,并将其设为父子组件方便初学,将来熟练以后可以考虑变为更常见的兄弟组件并使用event bus或者vuex来实现组件通信。

开发环境: Vue2.0、Node.js、npm、webpack、vue-cli、vue-resources、webstorm

为了以后项目工程化的目标,所以我们使用node+npm+webpack来构建项目。

准备工作包括安装node,npm,然后依次安装webpack,vue-cli

具体教程网上很多,就不在此赘述了。

1、选择一个文件夹放工程,cmd进入该目录

cd 目录路径(这里有个小坑,cd命令只对路径当前盘符有效果,例如在c盘输入d:../...是没有效果的还要再输入d:回车或者先进入d盘再cd 路径)

2、创建项目

vue init webpack-simple 工程名字(不能使用中文)

会有一些初始化的设置,如下输入:

Target directory exists. Continue? (Y/n)直接回车默认(然后会下载 vue2.0模板,慢的话连vpn)

Project name (vue-test)直接回车默认

Project description (A Vue.js project) 直接回车默认

use sass?(Y/n)是否使用sass,选n回车

Author 写你自己的名字

3、安装项目依赖

npm install(npm服务器在国外可能会很慢,实在不行挂vpn)

4、启动项目

npm run dev

正常的话默认浏览器就会打开页面了,如图:

这就是vue默认模板了,我们需要修改掉,开始建我们自己的项目。

首先修改src文件夹下的index.html:

Vue搜索

再到src下的main.js:

import Vue from 'vue';

import App from './App1.vue';

var vueResource = require('vue-resource');

Vue.use(vueResource);

new Vue({

el: '#app',

render: h => h(App)

})

注意这里import App from ‘./App1.vue’对应项目vue文件,要使用vue resources也要在这里声明。

然后在src下创建App1.vue:

import panel from './components/panel-new.vue'

export default {

components: {

panel

}

}

需要说明的是,vue文件一般来说由、、组成,对应放html、js和css代码。

这里出现第一个坑,就是template内只放一个div!

就算有并列的兄弟组件也还是要写成:

而不能是:

否则会报错。

引入组件后用export default导出到template中,此处有第二个bug:

千万不要在单文件组件(.vue)中再次new Vue()!

因为已经在main.js中创建过实例了,重复的实例将会出现意外,详情见我在seqement fault中的提问:

https://segmentfault.com/q/1010000009870708?_ea=2079044

接下来就是最关键的组件部分,在src下创建components文件夹,再新建logo-new.vue:

export default {

data () {

return {

//下拉图片背景初始值

imgSelected: -1,

//判断下拉条件

toggleState: false,

//界面显示哪张图片

imgState: 0,

//图片一类的静态文件,应该放在这个static文件夹下,

// 这个文件夹下的文件(夹)会按照原本的结构放在网站根目录下

imgs: [{

imgSrc: ('.././static/360_logo.png')

}, {

imgSrc: ('.././static/baidu_logo.png')

}, {

imgSrc: ('.././static/sougou_logo.png')

}]

}

},

methods: {

toggle: function () {

this.toggleState= !this.toggleState,

//清空上次背景色,

this.imgSelected= -1

},

changeImg: function (index) {

this.toggleState= !this.toggleState,

this.imgState= index,

this.$emit('logoNow', [index])

},

changeBackColor: function (index) {

this.imgSelected= index

},

leaveList: function () {

this.toggleState= false,

this.imgSelected= -1

}

}

}

ul {

padding: 0;

margin: 0;

}

.logoMain {

position: relative;

}

.listLogo {

z-index: 9999;

position: absolute;

top: 50%;

left: 60%;

width: 200px;

margin-left:-100px;

/*border: 1px solid #fefefe;*/

}

li {

background-color: #fefefe;

list-style-type: none;

width: 200px;

margin-left: -50px;

}

/*li:hover {

background-color: #ccc;

}*/

li img {

cursor: pointer;

width: 200px;

height: 58.33px;

}

.logoNow, .triangle{

cursor: pointer;

}

.triangle {

display: inline-block;

position: relative;

left: -80px;

top: -70px;

}

.triangle span {

position: absolute;

display: inline-block;

width: 0;

height: 0;

border-width: 8px;

border-color: #000 transparent transparent transparent;

border-style: solid dashed dashed dashed;

}

.fade-enter-active, .fade-leave-active {

transition: all .5s;

}

/* .fade-leave-active 在 <2.1.8 中 */

.fade-enter, .fade-leave-to {

opacity: 0;

-webkit-transform: translateY(20px);

-moz-transform: translateY(20px);

-ms-transform: translateY(20px);

-o-transform: translateY(20px);

transform: translateY(20px);

}

.colorBack {

background-color: #ccc;

cursor: pointer;

}

说下整体思想&#xff1a;

点击logo图片可以弹出下拉框选择3个不同的搜索引擎&#xff0c;再点击选项替换logo的img src。

因为vue是以mvvc模式&#xff0c;任何操作都要与模型(数据)挂钩&#xff0c;不能再用dom的思想&#xff1b;所以我们在data里给img设置一个数组&#xff0c;再由一个变量给定具体数值作为下标判断其显示状态。至于下拉菜单部分可以设置为一个ul列表&#xff0c;再用v-show指令控制其显示与否&#xff0c;同样用一个布尔值变量toggleState来判断&#xff0c;默认为false&#xff0c;一旦点击logo图片就会使其变为true&#xff0c;进而出现下拉菜单。

这里的重点在于如何将点击的li与切换到对应logo图片挂上钩&#xff1f;

原生js的思想是用一个for循环&#xff0c;获取到当前‘i’的值再去处理。Vue中也有类似的功能&#xff0c;在v-for循环中有一个参数‘index’可以表示当前索引&#xff0c;将其赋值给下标变量即可完成动态logo图片切换。

另一个难点在于如何在列表li添加hover变色效果&#xff1f;

最简单的方法自然是css中添加li&#xff1a;hover&#xff5b;background&#xff1a;#xxx&#xff5d;&#xff0c;

但这显然不是我们想要的方法&#xff0c;用了vue自然要利用其双边绑定的特性。

给li设置一个监听mouseover的方法&#xff0c;将当前index赋值给一个变量&#xff0c;再用一个三元表达式绑定class即只要变量值与当前index相等&#xff0c;则添加一个带背景色的class&#xff0c;否则class为空。

最后一个问题则是给下拉菜单添加过渡效果

vue封装了css3的transition效果&#xff0c;只要在元素上添加name属性&#xff0c;然后在style中用name-xxx指定参数即可&#xff0c;具体详见官网https://cn.vuejs.org/v2/api/#transition

还有一个坑就是给多个元素/组件设置过渡效果就要使用transition-group标签&#xff0c;像我们这个ul列表就是要的。

另外一个问题就是使用的时候一定要紧贴元素外层&#xff0c;不能中间隔了一个div&#xff0c;这样是没有效果的。

到此logo部分的组件大致完成&#xff0c;panel组件请留意我下一篇博文。

博主也是初学vue&#xff0c;并不精深&#xff0c;有出入的地方烦请各位看官指出&#xff01;



推荐阅读
  • 解决针织难题:R语言编程技巧与常见错误分析 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 本文详细介绍了如何在 Linux 系统上安装 JDK 1.8、MySQL 和 Redis,并提供了相应的环境配置和验证步骤。 ... [详细]
  • 本文详细介绍了 Charles 工具的下载、安装、配置及使用方法,特别针对 HTTP 和 HTTPS 协议的数据抓取进行了说明。 ... [详细]
  • 本文将详细介绍如何注册码云账号、配置SSH公钥、安装必要的开发工具,并逐步讲解如何下载、编译 HarmonyOS 2.0 源码。通过本文,您将能够顺利完成 HarmonyOS 2.0 的环境搭建和源码编译。 ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • WebStorm 是一款强大的集成开发环境,支持多种现代 Web 开发技术,包括 Node.js、CoffeeScript、TypeScript、Dart、Jade、Sass、LESS 和 Stylus。它为开发者提供了丰富的功能和工具,帮助高效构建和调试复杂的 Node.js 应用程序。 ... [详细]
  • 本文介绍了 Vue 开发的入门指南,重点讲解了开发环境的配置与项目的基本搭建。推荐使用 WebStorm 作为 IDE,其下载地址为 。安装时请选择适合您操作系统的版本,并通过 获取激活码。WebStorm 是前端开发者的理想选择,提供了丰富的功能和强大的代码编辑能力。 ... [详细]
  • 技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告
    技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告 ... [详细]
  • EST:西湖大学鞠峰组污水厂病原菌与土著反硝化细菌是多重抗生素耐药基因的活跃表达者...
    点击蓝字关注我们编译:祝新宇校稿:鞠峰、袁凌论文ID原名:PathogenicandIndigenousDenitrifyingBacte ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
author-avatar
helenheling2007895
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有