Vant 2 - 移动端 Vue 组件库 _ 问题记录

目录

基础组件

Popup 弹出层

表单组件

DatetimePicker 时间选择

Field 输入框

Form 表单

Picker 选择器

Radio 单选框

Uploader 文件上传

展示组件

List 列表

导航组件

Tab 标签页


发布初衷 :

记录在移动端项目中使用 Vant  2 组件库时遇到的各种问题 ,

方便以后再次遇到类似问题 , 能够快时查阅解决 ,

大家要是觉得有帮助的话 , 可以收藏一下 , 博主会不定时更新文章的

Vant 2 - 移动端 Vue 组件库 _ 问题记录_第1张图片


基础组件

Popup 弹出层

介绍

弹出层容器,用于展示弹窗、信息提示等内容,支持多个弹出层叠加展示。

问题记录 : Field 输入框 和 Popup 弹出层  两个 结合 使用 时 ,

在 iPhone 真机上测试的时候 出现的一个小 bug :

点击 Field 输入框 的时候 , 第一次会 弹出 一个 手机的键盘输入框

点击第二次的时候 才出来  Popup 弹出层 里面的内容 ( 比如 日期选择器 )

解决方案 : 

    给 Field 输入框 设置 readonly ,通过 readonly 将输入框设置为只读状态

输入框 van-field 必须得加入 readonly 这个 只读属性 ,

不然会导致 用户手机 触发 默认键盘 遮挡 你的弹窗和选择器内容 影响体验

也不要用 disabled 来禁用输入框 , 样式会变成禁用状态下的样式很难改动

只需要设置为只读即可 , 也不会触发手机键盘


表单组件

DatetimePicker 时间选择

介绍

时间选择器,支持日期、年月、时分等维度,通常与弹出层组件配合使用。

确认选择的时间数据是需要自己处理的,详见 confirmPicker 方法 





Vant 2 - 移动端 Vue 组件库 _ 问题记录_第2张图片


Field 输入框

介绍

表单中的输入框组件。

问题记录 : Field 输入框 和 Popup 弹出层  两个 结合 使用 时 ,

iPhone 真机 上测试的时候 出现的一个小 bug :

点击 Field 输入框 的时候 , 第一次会 弹出 一个 手机的键盘输入框

点击第二次的时候 才出来  Popup 弹出层 里面的内容 ( 比如 日期选择器 )

解决方案 : 

    给 Field 输入框 设置 readonly ,通过 readonly 将输入框设置为只读状态

输入框 van-field 必须得加入 readonly 这个 只读属性 ,

不然会导致 用户手机 触发 默认键盘 遮挡 你的弹窗和选择器内容 影响体验

也不要用 disabled 来禁用输入框 , 样式会变成禁用状态下的样式很难改动

只需要设置为只读即可 , 也不会触发手机键盘


Form 表单

介绍

用于数据录入、校验,支持输入框、单选框、复选框、文件上传等类型,需要与 Field 输入框 组件搭配使用。2.5 版本开始支持此组件。

需求背景 :

类似于表单提交页面或者“答题”页面( 表单项需要根据后端返回的数据动态循环生成 )

且回答页面需要增加用户校验是否已答并给出未答提示。

代码实现 :( 答题页面拆分成两部分:头尾组件 和 主体内容 组件 )

src / views / revise / index.vue






src / views / revise / components / HeadFooter.vue


Picker 选择器

介绍

提供多个选项集合供用户选择,支持单列选择和多列级联,通常与弹出层组件配合使用。

业务场景 :

一开始以为只能渲染纯数组

Vant 2 - 移动端 Vue 组件库 _ 问题记录_第3张图片

但后来用的时候 , 后端返回来的数据结构是 数组嵌套对象的模式 ,

因此还特意将数组对象里面的数据专门筛选出来一个新数组用于渲染。。

但后来传参的时候需要数据结构里面的其他数据用于传参

所以又找了找这个Picker选择器可不可以渲染数组对象结构的案例 :

Vant 2 - 移动端 Vue 组件库 _ 问题记录_第4张图片

发现 [ {  } ]  , 是可以渲染的 ,只不过还要做一下处理 :


使用案例 :


  
export default {
  data() {
    return {
      showTitle: false,
      columns: [], // 后端请求的数据
      queryFrom: {
        id: null,
        name: '',
      }
    };
  },
  methods: {
    onConfirm(value, index) {
      this.queryFrom.id = value.id // 需要传给后端的id值
      this.queryFrom.name = value.name // 用于渲染选择器列表数据
      this.showTitle = false // 关闭弹出层
    },
    onCancel() {
      this.showTitle = false
    },
  },
};

Vant 2 - 移动端 Vue 组件库 _ 问题记录_第5张图片

Vant 2 - 移动端 Vue 组件库 _ 问题记录_第6张图片

补充知识 :

vant-ui 之 Field 输入框 和 Picker 结合使用时 ,如何绑定正确的 id 类型的值的问题 。

很常见的需求 :

表单中的一项 ,需要从 picker 控件中选择正确的值后 ,展示的是字符串 ,

然后提交到后台服务器的则是字符串对应的 value 类型的值的问题。

Vant 2 - 移动端 Vue 组件库 _ 问题记录_第7张图片

点击表单的档案组,弹出 Picker 选择组件 ,选择正确的值 ,填充到表单项 ,但是 ,

提交到服务器去,需要提交对应的 id ,而不是看到的字符串。

如何实现 ?

定义两个属性,id 和 name , 两个是一 一对应的关系 。

在 van-picker 中 ,绑定的 confirm 函数 ,参数获取到的是一个对象 

在这个函数内,同时更新 id 和 name ,保证他俩一 一对应 。

  onConfirm(value, index) {
    this.queryFrom.id = value.id // 需要传给后端的id值
    this.queryFrom.name = value.name // 用于渲染选择器列表数据
    this.showTitle = false // 关闭弹出层
  },

如何展示 默认选中项

项目使用背景 :

用户填写表单时 , 需要根据上面填写的 乘车人数 来自动让下面的 Picker 选择器

下拉时 默认值 展示 与 人数相匹配 的 车辆类型

而又由于车辆类型是后端返回的数据 , 并不是固定不变的 , 所以前端没办法写死匹配方法

1、用户输入完 乘车人数 后 , 自动发起请求 , 由后端来匹配相对应的车辆类型

2、但是这里前端 Picker 组件需要用其索引值来展示下拉默认值 , 后端又无法返给我索引

3、前端这里只能先请求车辆类型数据列表后 , 再请求匹配车型数据值 , 循环去匹配后拿到当前匹配的索引值后再赋值给 Picker 组件


代码实现 :

根据乘车人数展示默认选中项


data() {
  return {
    defaultMatch: 0, // 车辆类型下拉展示默认索引值
    applyType: [], // 车辆类型列表
  }
}

methods: {
  // 根据乘车人数自动匹配车辆类型
  async blurMatchType() {
  let arr = []
  // 先请求车辆类型列表数据用于匹配
  let res = await this.getDicts('car_apply_type')
  if (res.code == 200) arr = res.data
  // 根据乘车人数请求匹配的车辆类型值
  let ret = await getMatchType(this.userCarForm.riderNum)
  const { code, data } = ret
  if (code == 200) {
      // 循环匹配后赋值其索引值
      arr.forEach((item, index) => {
        if (item.dictValue == data) {
          this.defaultMatch = index
        }
      })
    }
  }
}

Radio 单选框

介绍

用于在多个选项中选择单个结果。

与 Cell 组件一起使用

Vant 展示效果如下 :

Vant 2 - 移动端 Vue 组件库 _ 问题记录_第8张图片

但 UI 设计图里面是 单选框 在左侧,文字在右侧

百度解决案例 :

Vant 2 - 移动端 Vue 组件库 _ 问题记录_第9张图片

项目实际所用 :


  
    {{ item }}
  

需求升级,页面需要判断用户是否回答此项,思路是借鉴 Form表单 里面的验证。

详情请 移步 上方 Form 表单 了解。


Uploader 文件上传

介绍

用于将本地的图片或文件上传至服务器,并在上传过程中展示预览图和上传进度。目前 Uploader 组件不包含将文件上传至服务器的接口逻辑,该步骤需要自行实现。

需求背景 :

需要支持上传多种格式的文件类型

组件库内只说明了一种示例,而且上面的案例里面还没有使用

所以自己摸索百度解决一下吧 :




accept 的接受格式 :

*.3gpp    audio/3gpp, video/3gpp    3GPP Audio/Video
*.ac3    audio/ac3    AC3 Audio
*.asf    allpication/vnd.ms-asf    Advanced Streaming Format
*.au    audio/basic    AU Audio
*.css    text/css    Cascading Style Sheets
*.csv    text/csv    Comma Separated Values
*.doc    application/msword    MS Word Document
*.dot    application/msword    MS Word Template
*.dtd    application/xml-dtd    Document Type Definition
*.dwg    image/vnd.dwg    AutoCAD Drawing Database
*.dxf    image/vnd.dxf    AutoCAD Drawing Interchange Format
*.gif    image/gif    Graphic Interchange Format
*.htm    text/html    HyperText Markup Language
*.html    text/html    HyperText Markup Language
*.jp2    image/jp2    JPEG-2000
*.jpe    image/jpeg    JPEG
*.jpeg    image/jpeg    JPEG
*.jpg    image/jpeg    JPEG
*.js    text/javascript, application/javascript    JavaScript
*.json    application/json    JavaScript Object Notation
*.mp2    audio/mpeg, video/mpeg    MPEG Audio/Video Stream, Layer II
*.mp3    audio/mpeg    MPEG Audio Stream, Layer III
*.mp4    audio/mp4, video/mp4    MPEG-4 Audio/Video
*.mpeg    video/mpeg    MPEG Video Stream, Layer II
*.mpg    video/mpeg    MPEG Video Stream, Layer II
*.mpp    application/vnd.ms-project    MS Project Project
*.ogg    application/ogg, audio/ogg    Ogg Vorbis
*.pdf    application/pdf    Portable Document Format
*.png    image/png    Portable Network Graphics
*.pot    application/vnd.ms-powerpoint    MS PowerPoint Template
*.pps    application/vnd.ms-powerpoint    MS PowerPoint Slideshow
*.ppt    application/vnd.ms-powerpoint    MS PowerPoint Presentation
*.rtf    application/rtf, text/rtf    Rich Text Format
*.svf    image/vnd.svf    Simple Vector Format
*.tif    image/tiff    Tagged Image Format File
*.tiff    image/tiff    Tagged Image Format File
*.txt    text/plain    Plain Text
*.wdb    application/vnd.ms-works    MS Works Database
*.wps    application/vnd.ms-works    Works Text Document
*.xhtml    application/xhtml+xml    Extensible HyperText Markup Language
*.xlc    application/vnd.ms-excel    MS Excel Chart
*.xlm    application/vnd.ms-excel    MS Excel Macro
*.xls    application/vnd.ms-excel    MS Excel Spreadsheet
*.xlt    application/vnd.ms-excel    MS Excel Template
*.xlw    application/vnd.ms-excel    MS Excel Workspace
*.xml    text/xml, application/xml    Extensible Markup Language
*.zip    aplication/zip    Compressed Archive 


展示组件

List 列表

介绍

瀑布流滚动加载,用于展示长列表,当列表即将滚动到底部时,会触发事件并加载更多列表项。

List 组件通过 loading 和 finished 两个变量控制加载状态,当组件滚动到底部时,会触发 load 事件并将 loading 设置成 true

此时可以发起异步操作并更新数据,数据更新完毕后,将 loading 设置成 false 即可。

若数据已全部加载完毕,则直接将 finished 设置成 true 即可。


  


export default {
  data() {
    return {
      loading: false,
      finished: false,
      appList: [], // 用车申请列表
      appQuery: {
        page: '1', // 要查询的页码
        rows: '10', // 每页记录数量
        userId: null, // 用户 Id
      }
    };
  },
  methods: {
    async onLoad() {
      // 异步更新数据
      let ret = await getAppList(this.appQuery)
      const { code, data } = ret
      if (code == 200) {
        this.appList = this.appList.concat(data.rows)
        // 加载状态结束
        this.loading = false;
        if (this.appList.length >= data.total) {
          // 没有更多数据了
          this.finished = true;
          Notify({
            message: '已加载完全部订单',
            background: '#ee0a24'
          })
        } else {
          this.appQuery.page++
        }
      }
    },
  },
};

以上是正常情况下 , onLoad 滚动到底部可以正常触发加载下一页数据

接下来就是说明一个不正常使用情况 , 此 bug 组件库还未修复

就是 和 Tab 标签页 组件 公用 :

我猜估计是包裹内容的高度它无法断定了吧 , 所以 onLoad 加载就有问题了


导航组件

Tab 标签页


  
    
  
  
    
  
  
    
  
  
    
  


data() {
  return {
    active: 2,
  };
},

主要注意点就是子组件的高度需要设置一下 ,

一开始尝试的给 ApprovalItem 子组件一个高度  height:100% ,

但并没有解决一直触发 onLoad 加载的问题 ,

后来改成  height:100vh  , 就 OK 了 。。

没别的了 , 就是记录一下 , 提醒避坑 。


你可能感兴趣的:(前端,Vue,前端,Vant,2,组件库)