热门标签 | 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;



推荐阅读
  • idea激活服务器 3月最新注册码
    idea激活服务器3月最新注册码,https:www.yht7.comidea。详细ieda激活码不妨到云海天教程 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • phpcomposer 那个中文镜像是不是凉了 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • node.jsurlsearchparamsAPI哎哎哎 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 网址:https:vue.docschina.orgv2guideforms.html表单input绑定基础用法可以通过使用v-model指令,在 ... [详细]
  • 使用PhpStorm或WebStorm作为electron IDE
    最近在研究electron,考虑到以前一直用PhpStorm做开发,而且electron就是基于nodejs的,因此很自然的想到要继续用PhpStorm做IDE。开发打开RunDe ... [详细]
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社区 版权所有