vue 实现 ios 原生picker 效果及实现思路解析

下面我将为你详细讲解“vue 实现 ios 原生picker 效果及实现思路解析”的完整攻略。

标题

如何实现ios原生picker效果

在Vue中,实现ios原生picker效果主要是通过借助第三方插件picker-component来完成。picker-component是一个基于Vue的picker组件,实现了iphone风格的列表场景。在使用时,我们只需要按照Vue的组件方式把picker-component放在页面中,并传入需要显示的数据等参数即可。
在这里,我们将详细介绍picker-component的使用方法及实现原理。

picker-component使用示例

1. 安装和引入

首先我们需要使用npm安装picker-component:

npm install picker-component -S

接着,我们可以将其引入到项目中。在Vue的main.js中添加如下代码:

import Vue from 'vue'
import Picker from 'picker-component'

Vue.component('Picker', Picker)

2. 基本使用方法

假设我们有一个需求:在页面中拉出一个列表,里面的数据是从服务器端获取的。我们可以按照如下代码实现:

<template>
  <div>
    <picker v-model="selected" :columns="columns"></picker>
  </div>
</template>

<script>
export default {
  data() {
    return {
      selected: '',
      columns: [
        {
          values: ['选项1', '选项2', '选项3', '选项4', '选项5']
        }
      ]
    }
  }
}
</script>

上面的代码中,我们使用了picker-component的v-model来进行数据双向绑定,并通过columns参数指定了需要显示的数据。此时打开页面,就会看到一个类似ios原生picker的滚动列表了。

3. 自定义列数和列数据

除了只显示单列数据,我们还可以在使用时自定义列数和每列的数据。这个时候,我们可以这样来写:

<template>
  <div>
    <picker v-model="selected" :columns="columns"></picker>
  </div>
</template>

<script>
export default {
  data() {
    return {
      selected: '',
      columns: [
        {
          values: ['选项1', '选项2', '选项3', '选项4', '选项5']
        },
        {
          values: ['选项1', '选项2', '选项3', '选项4', '选项5']
        },
        {
          values: ['选项1', '选项2', '选项3', '选项4', '选项5']
        }
      ]
    }
  }
}
</script>

在上面的代码中,我们将columns参数包含了三个对象,每个对象代表了一个列表。每个对象中的values参数用来指定该列表中需要显示的内容。用上面的代码测试一下,你会看到页面上出现了三个滚动的列表。

实现思路解析

上面是使用picker-component实现ios原生picker效果的具体代码,接下来,我们将通过分析picker-component的源码,来解析其实现思路。

picker-component的基本结构

先看一下picker-component的基本结构:

<template>
  <div class="picker-container" @touchmove.prevent @touchend.prevent.stop="touchEnd">
    <div class="picker-mask" ref="mask"></div>
    <div class="picker-wrapper" ref="wrapper" @touchmove.prevent.stop="touchMove">
      <div class="picker-toolbar">
        <span class="picker-cancel" @click="hide">{{ cancelText }}</span>
        <span class="picker-title">{{ title }}</span>
        <span class="picker-submit" @click="submit">{{ submitText }}</span>
      </div>
      <div class="picker-content">
        <div class="picker-item" v-for="column in columns" :style="{ width: calc(100% / columns.length) }">
          <ul class="picker-wheel" ref="wheel" :data-index="columnIndex">
            <li v-for="(value, index) in column.values"
                :class="{ 'picker-wheel-item-selected': selectedIndex === index }"
                @click="select(index)">
              {{ value }}
            </li>
          </ul>
        </div>
      </div>
    </div>
  </div>
</template>

在上面的代码中,我们可以看到picker-component的基础结构。其中,最上层的div即为容器,包含了整个组件的内容。容器中的picker-mask用于遮罩列表内容,并阻止用户在未选择的情况下点击屏幕。picker-wrapper用于包含整个滚动列表,而picker-content则包含了所有picker-item。说简单一点,整个结构其实就是:容器→遮罩→滚动列表。

picker-component的逻辑实现

再来看一下picker-component的逻辑实现:

<script>
export default {
  name: 'picker',
  props: {
    title: String,
    cancelText: {
      type: String,
      default: '取消'
    },
    submitText: {
      type: String,
      default: '确定'
    },
    columns: Array,
    value: {
      type: Array,
      default: function () {
        return []
      }
    }
  },
  data() {
    return {
      selectedIndex: -1,
      init: true,
      scrollY: null,
      startY: null,
      columnIndexes: [],
      startValues: [],
      nowPosY: 0,
      distance: 0,
      translateY: 0,
      timestamp: 0,
      frame: 0
    }
  },
  watch: {
    value(val) {
      this.setValues(val)
    }
  },
  methods: {
    show() {},
    hide() {},
    onTouchStart(event) {},
    onTouchMove(event) {},
    onTouchEnd(event) {},
    setValues(val) {},
    onColumnChange(columnIndex) {}
  }
}
</script>

在上面的代码中,我们可以看到,picker-component主要包含了一些参数和方法。其中,props用于组件间传递参数;data则用于存储一些组件内部的数据;watch用于监听this.value的变化(this.value代表该组件的当前值,使用双向绑定的方式与父组件进行交互);而methods则包含了show、hide、onTouchStart等各种方法,用于实现组件的具体逻辑。

具体来讲,picker-component的逻辑实现过程如下:

  1. 用户点击picker-component,调用show()方法,在容器中显示滚动列表;
  2. 用户选择并确认了某个值后,调用hide()方法,隐藏列表,并向父组件传递选中的值;
  3. 当用户开始触摸屏幕时,调用onTouchStart()方法,并记录一些滚动列表开始的参数;
  4. 当用户滑动滚动列表时,调用onTouchMove()方法,处理并更新列表的位置;
  5. 当用户结束触摸屏幕时,调用onTouchEnd()方法,计算出应该停留在哪个位置,并更新选中值;
  6. 定义setValues()方法,用于初始值的赋值;
  7. 定义onColumnChange()方法,用于监听列改变的情况。

结论

以上就是关于“vue 实现 ios 原生picker 效果及实现思路解析”的完整攻略。使用picker-component可以很方便地实现ios原生picker效果,并且其内部的实现原理也很值得我们深入了解。希望这篇攻略对你有所帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue 实现 ios 原生picker 效果及实现思路解析 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • swiper+echarts实现多个仪表盘左右滚动效果

    下面详细介绍如何使用swiper和echarts实现多个仪表盘左右滚动效果的攻略。 一、安装swiper和echarts 在项目根目录下使用npm命令安装swiper和echarts: npm install swiper echarts 此处使用的是官方提供的npm安装方式,也可以使用其他方式如CDN等。 二、创建swiper容器和echarts容器 在H…

    css 2023年6月10日
    00
  • 详解为什么设置overflow为hidden可以清除浮动带来的影响

    当一个元素内部包含浮动元素时,这个内部包含浮动元素的元素高度将会塌陷,导致该元素的高度不符合预期,在布局时可能会出现问题。 而设置overflow属性为hidden可以清除浮动带来的影响,让元素的高度正常显示,原因是:当元素的overflow属性被设置为非visible时,它会生成一个新的BFC(Block Formatting Context),而BFC具…

    css 2023年6月9日
    00
  • 基于CSS3的CSS 多栏(Multi-column)实现瀑布流源码分享

    关于“基于CSS3的CSS 多栏实现瀑布流”的攻略,我会详细介绍以下几个方面: 基础知识 实现步骤 示例说明 1. 基础知识 在介绍具体的实现步骤之前,我们先来了解一下瀑布流的基本原理和CSS多栏的基础知识。 1.1 瀑布流的原理 瀑布流(waterfall)属于一种流式布局(flow layout),是一种网页设计的方式。它的特点是将网页上的内容按照固定的…

    css 2023年6月10日
    00
  • SEO HTML 标签权重列表小结

    让我来为您详细讲解“SEO HTML 标签权重列表小结”的完整攻略。 SEO HTML标签权重列表小结 什么是HTML标签权重? HTML标签权重是指在网站页面中,不同HTML标签对搜索引擎优化(SEO)的影响力大小,权重可以从1-10不等,数字越大影响越大。 HTML标签权重列表 下面是一张HTML标签权重的列表,用来帮助开发者更好的了解HTML标签的优化…

    css 2023年6月10日
    00
  • 2019腾讯暑期实习面试(offer)前端经验

    2019腾讯暑期实习前端经验攻略 一、准备阶段 熟悉面试流程和常见问题:腾讯的前端面试一般包括以下环节:自我介绍、技术问题、项目经验、算法题目等。在准备阶段,需要认真思考自己的经历,总结符合岗位需求的项目经验,预习算法和数据结构的基本知识。同时,可以查询和分析往年的招聘信息和面试体验,了解面试官可能提出的问题。 提前评估自身水平:对于前端开发而言,需要重点掌…

    css 2023年6月9日
    00
  • vue-cli5搭建vue项目的实现步骤

    下面是关于如何使用Vue cli 5搭建Vue项目的完整攻略。 1. 安装脚手架 首先,我们需要安装Vue Cli 5脚手架。可以通过npm命令来进行安装。安装命令如下: npm install -g @vue/cli@5 2. 创建Vue项目 在安装了Vue Cli 5之后,我们可以通过vue create命令来创建Vue项目。按照以下步骤进行创建: 步骤…

    css 2023年6月10日
    00
  • 纯css3制作煽动翅膀的蝴蝶的示例

    接下来我会详细讲解如何使用纯CSS3制作煽动翅膀的蝴蝶示例。 准备工作 在开始制作示例之前,我们需要准备以下素材: 蝴蝶的图片,保证图片分辨率清晰。 一些基本的HTML和CSS知识,对盒模型、定位、z-index等属性有一定的了解。 步骤 第一步: HTML结构的搭建 在HTML中定义一个div容器,作为蝴蝶的容器。并在这个容器中插入图片。具体代码如下: &…

    css 2023年6月10日
    00
  • 浏览器全屏显示背景图片的css样式与html结构

    要实现浏览器全屏显示背景图片,需要使用CSS的background-size属性和HTML的一些结构布局。 以下是具体的步骤: 首先,创建一个div元素,作为要设置背景图片的容器。可以使用如下代码: <div class="container"></div> 接着,在CSS样式表中设置该容器的宽度、高度、背景图片、…

    css 2023年6月9日
    00
合作推广
合作推广
分享本页
返回顶部