青橙优购—— 搜索组件

36 阅读2分钟

搜索

创建 search 分支

运行如下的命令,基于 master 分支在本地创建 search 子分支,用来开发搜索相关的功能:git checkout -b search

1 自定义搜索组件

1.1 自定义 my-search 组件

  1. 在项目根目录创建 components 目录上,鼠标右键,选择 新建组件,填写组件信息后,最后点击 创建 按钮:

  2. 在分类页面的 UI 结构中,直接以标签的形式使用 my-search 自定义组件:

    <!-- 使用自定义的搜索组件 -->
    <my-search></my-search>
    
  3. 定义 my-search 组件的 UI 结构如下:

    <template>
      <view class="my-search-container">
        <!-- 使用 view 组件模拟 input 输入框的样式 -->
        <view class="my-search-box">
          <uni-icons type="search" size="17"></uni-icons>
          <text class="placeholder">搜索</text>
        </view>
      </view>
    </template>
    

    注意:在当前组件中,我们使用 view 组件模拟 input 输入框的效果;并不会在页面上渲染真正的 input 输入框

  4. 由于自定义的 my-search 组件高度为 50px,因此,需要重新计算分类页面窗口的可用高度:

    onLoad() {
      const sysInfo = uni.getSystemInfoSync()
      // 可用高度 = 屏幕高度 - navigationBar高度 - tabBar高度 - 自定义的search组件高度
      this.wh = sysInfo.windowHeight - 50
    }
    

1.2 通过自定义属性增强组件的通用性

为了增强组件的通用性,我们允许使用者自定义搜索组件的 背景颜色 和 圆角尺寸

  1. 通过 props 定义 bgcolor 和 radius 两个属性,并指定值类型和属性默认值:

    props: {
      // 背景颜色
      bgcolor: {
        type: String,
        default: '#C00000'
      },
      // 圆角尺寸
      radius: {
        type: Number,
        // 单位是 px
        default: 18
      }
    }
    
  2. 通过属性绑定的形式,为 .my-search-container 盒子和 .my-search-box 盒子动态绑定 style 属性:

    <view class="my-search-container" :style="{'background-color': bgcolor}">
      <view class="my-search-box" :style="{'border-radius': radius + 'px'}">
        <uni-icons type="search" size="17"></uni-icons>
        <text class="placeholder">搜索</text>
      </view>
    </view>
    
  3. 移除对应 scss 样式中的 背景颜色 和 圆角尺寸

1.3 为自定义组件封装 click 事件

  1. 在 my-search 自定义组件内部,给类名为 .my-search-box 的 view 绑定 click 事件处理函数:

    <view class="my-search-box" :style="{'border-radius': radius + 'px'}" @click="searchBoxHandler">
      <uni-icons type="search" size="17"></uni-icons>
      <text class="placeholder">搜索</text>
    </view>
    
  2. 在 my-search 自定义组件的 methods 节点中,声明事件处理函数如下:

    methods: {
      // 点击了模拟的 input 输入框
      searchBoxHandler() {
        // 触发外界通过 @click 绑定的 click 事件处理函数
        this.$emit('click')
      }
    }
    
  3. 在分类页面中使用 my-search 自定义组件时,即可通过 @click 为其绑定点击事件处理函数:

    <!-- 使用自定义的搜索组件 -->
    <my-search @click="gotoSearch"></my-search>
    

    同时在分类页面中,定义 gotoSearch 事件处理函数如下:(在分包文件夹创建search页面后)

    methods: {
       // 跳转到分包中的搜索页面
       gotoSearch() {
         uni.navigateTo({
           url: '/subpkg/search/search'
         })
       }
    }
    

1.4 实现首页搜索组件的吸顶效果

  • 顶部搜索组件不加控制会随页面滚动消失

image.png

  1. 在 home 首页加自定义组件效果同上

image.png

  1. 通过如下的样式实现吸顶的效果:(一定要在组件外加一个view来修改样式)

    .search-box {
      // 设置定位效果为“吸顶”
      position: sticky;
      // 吸顶的“位置”
      top: 0;
      // 提高层级,防止被轮播图覆盖
      z-index: 999;
    }
    
    1. 开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 18天,点击查看活动详情