小程序 使用动画将picker-view模拟类似picker的效果 picker也可能造成appLaunch with an already exist webviewId报错信息

在小程序开发中,picker在许多地方会用到,但是可能不会满足产品的要求,此时可以使用picker-view进行处理

js文件中使用createAnimation创建动画来做过度效果,当然也可以在css中加入动画,不过我就要用js  -。-

// pages/myTimeSelect/myTimeSelect.js
const date = new Date()
const years = []
const months = []
const days = []
var self

for (let i = 1990; i <= date.getFullYear(); i++) {
  years.push(i)
}

for (let i = 1; i <= 12; i++) {
  months.push(i)
}

for (let i = 1; i <= 31; i++) {
  days.push(i)
}
Page({

  /**
   * 页面的初始数据
   */
  data: {
    years: years,
    year: date.getFullYear(),
    months: months,
    month: 2,
    days: days,
    day: 2,
    value: [9999, 1, 1],
    myTimeChoose: false,
    myTimeChooseViewAnimationData: {},
    myTimePickerViewMaskViewAnimationData: {},
    pickerViewHeight: 300,
    pickerViewTime: 300,
  },
  bindChange: function (e) {
    const val = e.detail.value
    this.setData({
      year: this.data.years[val[0]],
      month: this.data.months[val[1]],
      day: this.data.days[val[2]]
    })
  },
  chooseSezi: function (e) {
    // 创建一个动画实例
    var myTimeChooseViewAnimation = wx.createAnimation({
      // 动画持续时间
      duration: self.data.pickerViewTime,
      // 定义动画效果,当前是匀速
      timingFunction: 'ease'
    })
    // 先在y轴偏移,然后用step()完成一个动画,先向下动画pickerView个高度
    myTimeChooseViewAnimation.translateY(self.data.pickerViewHeight).step()

    var myTimePickerViewMaskViewAnimation = wx.createAnimation({
      duration: self.data.pickerViewTime,
      timingFunction: 'ease'
    })
    myTimePickerViewMaskViewAnimation.opacity(0).step()


    // 用setData改变当前动画
    self.setData({
      // 通过export()方法导出数据
      myTimeChooseViewAnimationData: myTimeChooseViewAnimation.export(),
      myTimePickerViewMaskViewAnimationData: myTimePickerViewMaskViewAnimation.export(),
      // 改变view里面的Wx:if
      myTimeChoose: true
    })
    // 再还原到之前位置
    myTimeChooseViewAnimation.translateY(0.2).step()
    myTimePickerViewMaskViewAnimation.opacity(1).step()
    self.setData({
      myTimeChooseViewAnimationData: myTimeChooseViewAnimation.export(),
      myTimePickerViewMaskViewAnimationData: myTimePickerViewMaskViewAnimation.export()
    })
  },
  myTimePickerViewMaskViewTap: function (e) {
    var myTimePickerViewMaskViewAnimation = wx.createAnimation({
      duration: self.data.pickerViewTime,
      timingFunction: 'ease'
    })
    myTimePickerViewMaskViewAnimation.opacity(-0.8).step()

    var myTimeChooseViewAnimation = wx.createAnimation({
      duration: self.data.pickerViewTime,
      timingFunction: 'ease'
    })
    myTimeChooseViewAnimation.translateY(0).step()
    self.setData({
      myTimeChooseViewAnimationData: myTimeChooseViewAnimation.export(),
      myTimePickerViewMaskViewAnimationData: myTimePickerViewMaskViewAnimation.export(),
      myTimeChoose: false
    })
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    self = this;
  },
})

wxss文件

<!--pages/myTimeSelect/myTimeSelect.wxml-->
<view class='text' bindtap='chooseSezi'>请选择时间</view>

<view class='myTimePickerViewMaskView' wx:if="{{myTimeChoose}}" bindtap='myTimePickerViewMaskViewTap' animation='{{myTimePickerViewMaskViewAnimationData}}'></view>
<view class='myTimeChooseView' wx:if="{{myTimeChoose}}" animation='{{myTimeChooseViewAnimationData}}' style='height: {{pickerViewHeight}};'>
  <view>{{year}}年{{month}}月{{day}}日</view>
  <picker-view indicator-style="height: 50px;" style="width: 100%; height: 300px;" value="{{value}}" bindchange="bindChange">
    <picker-view-column>
      <view wx:for="{{years}}" wx:key='year' style="line-height: 50px" class='intro'>{{item}}年</view>
    </picker-view-column>
    <picker-view-column>
      <view wx:for="{{months}}" wx:key='month' style="line-height: 50px" class='intro'>{{item}}月</view>
    </picker-view-column>
    <picker-view-column>
      <view wx:for="{{days}}" wx:key='day' style="line-height: 50px" class='intro'>{{item}}日</view>
    </picker-view-column>
  </picker-view>
</view>

css

.intro {
  text-align: center;
}

.myTimePickerViewMaskView {
  position: absolute;
  top: 0;  
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.5);
}

.myTimeChooseView {
  position: absolute;
  width: 100%;
  bottom: 0;
  background-color: #fff;
}

本文为小程序的一个简单页面,可以简单了解js动画的实现 QAQ

另外小程序在启动时报错 appLaunch with an already exist webviewId 加上个数字,可能是因为在首页中有picker未设置默认值导致的,有此问题的小伙伴可以尝试添加value值试试

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
使用 `picker-view-column` 时报错可能是因为以下原因: 1. `picker-view-column` 组件必须嵌套在 `picker-view` 组件中使用,否则会报错。 2. `picker-view-column` 组件的 `name` 属性必须设置为 `picker-view-column`,否则会报错。 3. `picker-view-column` 组件的 `value` 属性必须与 `picker-view` 组件的 `value` 属性保持一致,否则会报错。 4. `picker-view-column` 组件的 `range` 属性必须设置为一个数组,数组中的每个元素都是一个对象,表示该列的选项,否则会报错。 以下是一个示例代码,展示了 `picker-view` 和 `picker-view-column` 的使用方法: ```vue <template> <view> <picker-view :value="selected" @change="onChange"> <picker-view-column :name="'picker-view-column'" :value="selected[0]" :range="range[0]"></picker-view-column> <picker-view-column :name="'picker-view-column'" :value="selected[1]" :range="range[1]"></picker-view-column> <picker-view-column :name="'picker-view-column'" :value="selected[2]" :range="range[2]"></picker-view-column> </picker-view> </view> </template> <script> export default { data() { return { range: [ ['北京', '上海', '广州', '深圳'], ['朝阳区', '海淀区', '东城区', '西城区'], ['1号线', '2号线', '3号线', '4号线'] ], selected: [0, 0, 0] } }, methods: { onChange(e) { this.selected = e.detail.value console.log('选择的值:', this.range[0][this.selected[0]], this.range[1][this.selected[1]], this.range[2][this.selected[2]]) } } } </script> ``` 在上面的代码中,`picker-view-column` 组件被嵌套在了 `picker-view` 组件中,每个 `picker-view-column` 组件都表示一列选项。`range` 数组中包含了三个数组,分别表示三列选项的内容。`selected` 数组表示每列选项的默认选中值。在 `onChange` 方法中,通过 `e.detail.value` 获取选择器选中的值,然后可以根据这些值做出相应的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值