wepy组件控制弹窗淡入淡出,父组件控制内容与显示事件

本文详细介绍了在Wepy框架中,如何实现父组件向子组件传递数据,并通过子组件处理显示逻辑,包括消息内容、显示时长及淡入淡出效果的实现。通过实例演示了如何使用双向绑定和监听函数更新组件状态。

描述

  1. 父组件加载子组件
  2. 父组件传值给子组件(显示内容,显示时长)
  3. 重复点击同一事件或者不同事件单个显示时长不变(清理定时器)
  4. 类似弹窗都可转换

代码

father.wpy   //父组件
<template>
  <child :msg.sync="fmsg" :time.sync="ftime"></child>    //调用子组件
  <button @tap="clicked('welcome',2)">1</button>        //测试事件(可以换成自己需要的事件)
  <button @tap="clicked('海小玉',3)">2</button>
</template>
<script>
import wepy from 'wepy';
import Child from "../components/child";              //引用子组件

export default class Food extends wepy.page {
  config = {															
    navigationBarTitleText: "弹窗淡入淡出",
    backgroundColor: "#F5F4F5"
  } 
    data = {														
    ftime: 3,
    fmsg: ''
  }
  components = {
    child: Child
  }
  methods = {
    clicked(msg, time) {
      this.fmsg = msg;
      this.ftime = time;
    }
child.wpy   					//子组件
<template>
  <view class="com {{inout?'in':'out'}}">{{msg}}</view>   //利用class控制淡入淡出样式
</template>
<script>
import wepy from 'wepy'
export default class Child extends wepy.component {
  props = {								//定义属性
    msg: {
      type: String,						//类型
      default: '', 						//默认值
      twoWay: true						//与父组件配合实现双向绑定
    },
    time: {
      type: Number,
      default: 3,
      twoWay: true
    },

  }
  data = {
    inout: false,
    timer: ''								//声明定时器
  }

  watch = {									//监控
    msg(newValue, oldValue) {				//监控msg变化
      var me = this;		
      if (newValue) {
        if (this.timer) {					//清理定时器
          clearTimeout(this.timer);
        }
        this.inout = true;
        this.$apply();						//及时手动绑定,否则会出错
        this.timer = setTimeout(() => {		//设置定时器
          me.inout = false;					//内容显示完毕后进行淡出效果
          me.$apply();
          setTimeout(() => {				//为了防止msg突然消失
            me.msg = '';
            me.$apply();
          }, 500);
        }, this.time * 1000)
      }
    }
  }
  onLoad() {
    console.log('child 被调')   		 //测试子组件是否被调用
  }
}

</script>
<style lang="less">
.com {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  margin: 0 auto;
  z-index: 10;
  width: 400rpx;
  height: 60rpx;
  line-height: 60rpx;
  border-radius: 10rpx;
  text-align: center;
  font-size: 32rpx;
  background-color: pink;
  opacity: 0;
  transition: all .5s;   				//过渡时间(淡入淡出动画时间)
}
.in {
  opacity: 1;
}
.out {
  opacity: 0;
}
</style>

注意几点

  1. 父子组件之间的传值绑定
  2. 所有的处理最好都在子组件处理,父组件只实现调用,越简单越好
  3. 子组件的函数处理可以在监听函数里面完成(watch = {})
  4. 需要马上绑定数据改变的最好用$apply()及时绑定
  5. 注意定时器的清理位置
uni-app 是一款基于 Vue 的移动端跨平台开发框架,它允许开发者编写一次代码,生成适用于微信小程序、H5、App 等多种环境的应用。对于自定义弹窗淡入淡出效果,uni-app 提供了丰富的组件和 API 来实现动画。 在 uni-app 中,你可以通过以下步骤创建一个带淡入淡出动画的自定义弹窗: 1. 使用 `dialog` 组件展示弹窗,这是uni-app内置的对话框组件,支持自定义内容。 ```html <view @open="showModal" @close="hideModal"> <button @click="openDialog">点击打开</button> </view> <dialog v-model="isDialogVisible" :style="{ display: isDialogVisible ? 'block' : 'none' }"> <!-- 自定义内容 --> </dialog> ``` 2. 在 JavaScript 中控制弹窗显示隐藏,并添加淡入淡出的动画。uni-app 的 `Vue` 实例提供了生命周期钩子 `beforeUpdate` 和 `updated`,可以在其中监听视图的变化并调整样式。 ```js data() { return { isDialogVisible: false, } }, methods: { showModal() { this.isDialogVisible = true; }, hideModal() { this.isDialogVisible = false; }, openDialog() { // 添加动画效果,假设使用 CSS 动画 this.$nextTick(() => { this.$refs.dialog.style.transform = 'scale(1)'; setTimeout(() => { this.$refs.dialog.style.transform = ''; }, 500); // 动画持续时间,这里用了500ms }); }, } ``` 3. 如果需要更精细的控制动画效果,可以在 CSS 中为 `.dialog` 或者对应的类名设置 `transition` 或者 `animation` 属性,配合 Vue 的 `$refs` 访问 DOM 元素。 注意,在实际项目中,你可能需要针对不同平台调整动画性能,因为一些旧版本的微信小程序对动画的支持有限。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值