Header组件热门搜索栏的实现示例

目录
  • 1. 基本布局
    • 1.1 热门搜索框
    • 1.2 热门搜索Title和换一换图标
    • 1.3 热门Tag
  • 2. 控制展示
  • 3. 使用 Ajax 请求获取 Tag 数据
    • 3.1 使用 redux-thunk 返回函数
    • 3.2 使用 Immutable 的数组进行 state 统一更新
    • 3.3 使用 map 方法循环展示内容
  • 4. 优化 reducer

1. 基本布局

本次任务是实现热门搜索模块的布局和展示控制功能。

1.1 热门搜索框

在布局过程中,我们发现热门搜索框并没有出现。这可能是由于外部组件存在 overflow: hidden 属性导致的,因此我们需要给一个高度解决这个问题:

cssCopy code
export const SearchInfo = styled.div`
  position: absolute;
  left: 0;
  top: 56px;
  width: 240px;
  height: 100px;
  padding: 0 20px;
  background: green;
`;

接下来,我们通过简书官网调试的方法补全其他属性。

1.2 热门搜索Title和换一换图标

接下来,我们需要添加热门搜索Title和换一换图标。

cssCopy code
export const SearchInfoTitle = styled.div`
  margin-top: 20px;
  margin-bottom: 15px;
  line-height: 20px;
  font-size: 14px;
  color: #969696;
`;

然后需要实现换一换的功能。

1.3 热门Tag

我们还需要添加热门Tag的样式:

cssCopy code
export const SearchInfoItem = styled.a`
  display: block;
  float: left;
  line-height: 20px;
  padding: 0 5px;
  font-size: 12px;
  border: 1px solid #ddd;
  color: #969696;
  border-radius: 2px;
  margin-right: 10px;
  margin-bottom: 15px;
`;

但是此时发现高度出了问题了,因此我们需要在外层布局进行修改:

cssCopy code
export const SearchWrapper = styled.div`
  position: relative;
  float: left;
  .iconfont {
    position: absolute;
    right: 5px;
    bottom: 5px;
    width: 30px;
    height: 30px;
    line-height: 30px;
    border-radius: 15px;
    text-align: center;
    &.focused {
      background: #777;
      color: #fff;
    }
  }
  .slide-enter {
    transition: all 0.2s ease-out;
  }
  .slide-enter-active {
    width: 240px;
  }
  .slide-exit {
    transition: all 0.2s ease-out;
  }
  .slide-exit-active {
    width: 160px;
  }
`;
export const SearchInfo = styled.div`
  position: absolute;
  left: 0;
  top: 56px;
  width: 240px;
  padding: 0 20px;
  background: green;
`;

同时,我们将上面 SearchInfo 写死的高度去掉。

2. 控制展示

官方文档描述了 SearchInfo 区域应该在鼠标聚焦时显示,失去焦点时隐藏。我们可以通过控制 SearchInfo 区域来实现这个逻辑,而且这个控制逻辑与之前用于控制动画的控制参数非常相似。

3. 使用 Ajax 请求获取 Tag 数据

实际上,热门 Tag 的数据是从服务器获取的。我们希望通过 Ajax 来获取这些数据,就像简书网站一样。而且我们只需要在第一次聚焦时获取数据,然后进行本地缓存。

此时,我们需要将 header 中的列表内容进行存储,以便后续进行状态管理。初始时,它是一个空数组。

3.1 使用 redux-thunk 返回函数

当 Nav 聚焦时,我们需要获取 Ajax 数据。由于这是一个异步操作,所以需要使用第三方库。我们统一使用 redux-thunk 进行操作,将异步操作放在 action 中处理。

应该在创建 store 时使用 redux-thunk:

接下来,我们需要派发异步 action:

然后创建这个 Action:

如果需要使用 Ajax,则需要使用第三方库 axios 来实现异步请求:

import axios from 'axios';
export const getList = () => { return (dispatch) => { // 异步请求 axios.get('/api/headerList.json').then(()=>{
    }).catch(()=>{
        console.log('error');
    });
}
};

当后端数据还未开发完成时,我们可以使用前端制作的假数据。我们可以使用 create-react-app 的特性,在 public 和 src 目录下创建一个对应的 JSON 文件,然后就可以访问了。在此期间,路由也需要进行修改,以便实现假数据。

然后,我们需要修改 state。我们需要在回调中派发一个新的 action:

const changeList = (data) => ({ type: constants.CHANGE_LIST, data });
export const getList = () => { return (dispatch) => { // 异步请求 axios.get('/api/headerList.json').then((res) => { const data = res.data; dispatch(changeList(data.data)) }).catch(()=>{ console.log('error'); }); } };

3.2 使用 Immutable 的数组进行 state 统一更新

接下来,我们需要在 reducer 中根据获取的 data 更新 list。但是有一点需要注意:我们使用 fromJS() 方法将 list 变成了一个 Immutable 数组。但是,当我们调用 state.set() 方法去改变 list 时,action.data 本身是一个普通的数组,这两种数据类型不同会出现错误。因此,我们需要将 data 转换为 Immutable:

然后,我们可以按如下方式编写 reducer:

3.3 使用 map 方法循环展示内容

最后,需要将数据展示出来。可以使用 map 方法来遍历数组,并渲染列表项:

javascriptCopy code
getListArea(show) {
  if (show) {
    return (
      <SearchInfo>
        <SearchInfoTitle>
          热门搜索
          <SearchInfoSwitch>
            换一批
          </SearchInfoSwitch>
        </SearchInfoTitle>
        <SearchInfoList>
          {this.props.list.map((item) => {
            return <SearchInfoItem key={item}>{item}</SearchInfoItem>;
          })}
        </SearchInfoList>
      </SearchInfo>
    );
  } else {
    return null;
  }
}

即使是使用 immutable 数组,也可以使用 map 方法进行遍历。

4. 优化 reducer

之前的 reducer 大量使用 if 语句,可以通过使用 switch-case 进行优化:

cCopy code
export default (state = defaultState, action) => {
  switch (action.type) {
    case constants.SEARCH_FOCUS:
      return state.set('focused', true);
    case constants.SEARCH_BLUR:
      return state.set('focused', false);
    case constants.CHANGE_LIST:
      return state.set('list', action.data);
    default:
      return state;
  }
};

使用 switch-case 可以让 reducer 代码更加清晰易懂。

以上就是Header组件热门搜索栏的实现示例的详细内容,更多关于Header组件热门搜索栏的资料请关注我们其它相关文章!

(0)

相关推荐

  • Flutter实现固定header底部滑动页效果示例

    目录 正文 实现 正文 实现的效果是这样的: 刚开始的时候,是在dev上找了两个轮子,简单测了下,都不太满意,滑动事件处理的比较粗糙,总有bug.就在想着,要不要拿源码改一版的时候,让我无意间看到了这个帖子 里面的想法,大开眼界,是通过 DraggableScrollableSheet 和 IgnorePointer 来完美实现上面的效果. 实现 这是 DraggableScrollableSheet 的代码, DraggableScrollableSheet( maxChildSize: 0.

  • 好用的VSCode头部注释插件Fileheader Pro

    目录 动机 安装与使用 如何获得它 让它默默添加头部注释 自定义模板 配置项 FileheaderPro.disableFileds FileheaderPro.companyName FileheaderPro.currentUserName和FileheaderPro.currentUserEmail FileheaderPro.dateFormat FileheaderPro.autoInsertOnCreateFile FileheaderPro.autoUpdateOnSave 它是怎

  • Vue header组件开发详解

    一. header 组件开发 之数据的传递 1. App.vue 引入组件 import header from './components/header/header' 2. App.vue 中注册组件 export default { components:{ v-header:header } } 3. 使用组件 <v-header :sell="sellerObj"></v-header> 解释::sell="sellerObj",这

  • resty更新header控制api版本数据源读写分离

    目录 前言 1.使用header来控制api版本 2.读写分离的数据源支持 前言 Resty目前积累到450 star,还有1个多月满一年了,在没有推广的情况下如果能积累到500 star,真是棒棒的,如果觉得不错可以给颗心(https://github.com/Dreampie/Resty),希望大家多多鼓励,也希望有心的同学参与维护,开源说明它属于大家,无论你使用或者作为一个框架的基础学习还是从中得到灵感做出好用的东西 都希望你能和大家一起分享 开源希望大家互相帮助. 本次更新说大不大说小不

  • VSCode多行注释插件KoroFileHeader使用示例

    目录 1.简介 主要功能 2.安装 3.使用 默认快捷键 文件头部注释快捷键 函数注释快捷键 图案注释快捷键 自定义快捷键 4.插件自定义配置 1.简介 VSCode插件: 用于一键生成文件头部注释并自动更新最后编辑人和编辑时间.函数注释自动生成和参数提取. 插件可以帮助用户养成良好的编码习惯,规范整个团队风格. 主要功能 自动生成文件头部注释,自动更新最后编辑人.最后编辑时间等. 一键生成函数注释,支持函数参数自动提取并列到注释中. 支持添加佛祖保佑永无bug.神兽护体.甩葱少女等好玩有趣的图

  • 详解Vue后台管理系统开发日常总结(组件PageHeader)

    在后台管理系统的日常开发过程中发现对于同一个业务下面的版块不同的开发同事每次都会重复写页面标题的样式,而且不同的页面标题还不太一样.虽然有的页面标题栏承载的元素不一样,但是也有通用的部分,经过多个项目的迭代慢慢地总结与积累完善出了一个通用的页面标题组件<PageHeader/>. 下面是一个最常见的标题设计原型: 下面是同事给出的封装方案: 使用方式 <router-back class="router-back" text="详情" />

  • NSURLSession跨域重定向透传HTTP Header问题解决

    目录 背景 系统库如何设计的 解决方案 方案一 方案二 背景 在源网页通过服务器重定向打开某个三方网页,网络层出现了 -1005 (NSURLErrorNetworkConnectionLost) 错误码,排查差异后发现是由于给这个三方服务带了源网页特有的 HTTP Header,导致服务器检查异常从而断开连接. 核心原因是跨域重定向场景透传了 Header 带到了三方服务,这有些不符合常理,会带来两个明显的问题: 敏感 HTTP Header 传递给三方服务,存在隐私安全问题: 服务收到未预期

  • Go结构体SliceHeader及StringHeader作用详解

    目录 引言 SliceHeader 疑问 坑 StringHeader 0 拷贝转换 总结 引言 在 Go 语言中总是有一些看上去奇奇怪怪的东西,咋一眼一看感觉很熟悉,但又不理解其在 Go 代码中的实际意义,面试官却爱问... 今天要给大家介绍的是 SliceHeader 和 StringHeader 结构体,了解清楚他到底是什么,又有什么用,并且会在最后给大家介绍 0 拷贝转换的内容. 一起愉快地开始吸鱼之路. SliceHeader SliceHeader 如其名,Slice + Heade

  • Header组件热门搜索栏的实现示例

    目录 1. 基本布局 1.1 热门搜索框 1.2 热门搜索Title和换一换图标 1.3 热门Tag 2. 控制展示 3. 使用 Ajax 请求获取 Tag 数据 3.1 使用 redux-thunk 返回函数 3.2 使用 Immutable 的数组进行 state 统一更新 3.3 使用 map 方法循环展示内容 4. 优化 reducer 1. 基本布局 本次任务是实现热门搜索模块的布局和展示控制功能. 1.1 热门搜索框 在布局过程中,我们发现热门搜索框并没有出现.这可能是由于外部组件存

  • vue2.0使用swiper组件实现轮播的示例代码

    1.安装swiper npm install swiper@3.4.1 --save-dev 2.引用组件 import Swiper from 'swiper'; import 'swiper/dist/css/swiper.min.css'; 3.html页面代码 <div class="swiper-container" id="swiper"> <div class="swiper-wrapper"> <di

  • vue中父子组件的参数传递和应用示例

    1.在父组件中调用子组件,父亲传值给子组件 子组件如下,把要传给给父亲的值放在props中 template> <!--底部导航--> <div class="index-bbar"> <ul class="flex" > <li v-for="(item,index) in liAry" :class="index==licurrent?'active':''"> <

  • vue组件生命周期钩子使用示例详解

    目录 组件生命周期图 组件生命周期钩子 1.beforeCreate 2.created 3.beforeMount 4.mounted 5.beforeUpdate 6.updated 7.activated 8.deactivated 9.beforeDestroy 10.destroyed 11.errorCaptured 组件生命周期图 组件生命周期钩子 所有的生命周期钩子自动绑定 一.组件的生命周期:一个组件从创建到销毁的整个过程 二.生命周期钩子:在一个组件生命周期中,会有很多特殊的

  • react 组件实现无缝轮播示例详解

    目录 正文 无缝轮播 实现思路 构思使用时代码结构 Carousel组件 CarouselItem组件 完善组件 完成小圆点 正文 需求是做一个无缝轮播图,我说这不是有很多现成的轮子吗?后来了解到他有一个特殊的需求,他要求小圆点需要在轮播图外面,因为现在大部分插件都是将小圆点写在轮播图内部的,这对于不了解插件内部结构的小伙伴确实不知道如何修改. 很久没有写插件的我准备写一个插件(react) 无缝轮播 无缝轮播从最后一张到第一张的过程中不会原路返回,它就像轮子似的,从结束到开始是无缝连接的,非常

  • Blazor实现组件嵌套传递值的示例详解

    实现创建一个Blazor Server空的应用程序 创建一个Tab.razor 并且添加以下代码 <div> @Title </div> @code { [CascadingParameter] public string? Title { get; set; } } 修改Index.razor组件代码 @page "/" <CascadingValue Value="Title"> <Tab/> </Casca

  • Vue3之元素和组件的动画切换实现示例详解

    目录 前言 实例解析 元素间的动画切换 组件间的动画切换 总结 前言 当我们使用某个软件或者网站完成一些交互的时候,会发现做得很好的网站和软件都少不了动画的润色,完成的功能都是从一个界面跳转到另一个界面,但是加动画和不加动画完全是两种不同的体验,而且动画还可以遮住一些缺陷,比如相机预览从16:9切换到4:3时会出现黑边的情况,这时加一个转场动画,用户就不会看到这个黑边了,同样在网站开发中如果说加载的另一个页面网络不太好时,我们可以使用一个加载动画,让用户感觉当前系统仍然正常.不会出现“卡死”的假

  • 在React 组件中使用Echarts的示例代码

    在完成一个需求的时候碰到一个场景需要使用柱状图.涉及到可视化,第一反应当然是Echarts了.平时用js加载Echarts组件很方便,但是在React中就要费下神了.各种连蒙带猜实现了.edmo里的 这里我们要在自己搭建的react项目中使用ECharts,我们可以在ECharts官网上看到有一种方式是在 webpack 中使用 ECharts,我们需要的就是这种方法. 我们在使用ECharts之前要先安装ECharts,在以往的开发模式中,我们很多使用就是把官网中的ECharts的核心js文件

  • 微信小程序非跳转式组件授权登录的方法示例

    首先附上官方文档地址和授权流程 官方地址:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html 流程图: 大致逻辑:授权 -> 发送code到服务器获取session_key - > 保存在小程序缓存内 -> 调用wx.getUserInfo和session_key获取用户信息 -> 登录成功返回访问token -> 记录登录状态 -> 执行登录成功监听(失败

随机推荐