android 微信sliderbar,微信小程序自定义NavBar组件开发教程

组件化本身是一个可以讲的很大,也可以浓缩为封装可复用的,基于模版组件的微信小程序当然也支持这一特性。这种开发模式有点类似与网页开发中的header和footer分离式封装的特性。其实工具类的组装也可以作为组件化的一种形式。

小程序的组件化挺有意思的基于Component,自行实现了一套比较深的实现(这篇不讲实现),第一次看感觉跟Page好,或者说是换汤不换药。但内部组件(页面)的生命周期,事件处理等有自己的特点。从小程序基础库版本 1.6.3 开始,小程序支持简洁的组件化编程。所有自定义组件相关特性都需要基础库版本 1.6.3 或更高。开发者可以将页面内的功能模块抽象成自定义组件,以便在不同的页面中重复使用;也可以将复杂的页面拆分成多个低耦合的模块,有助于代码维护。自定义组件在使用时与基础组件非常相似。

目录结构

c935aafa9cbf34db499a4c2c1f404075.png

蓝色是自定义的组件,红色是引用他的首页

实现

功能来源是组件库中提取出来的,就是把本来Page页面改成Component,然后给大家理一理过程。

首先是提取功能代码在dist/example/navbar目录下

navbar.json

{

component: true,

usingComponents: {}

}

如果有用到其他组件,那就定义一下,没有的话可以不管。

component要为true。

这边任意一个点击都会触发tabClick()这个方法

class=”weui-navbar__slider”的这个view用来绘制内容偏移的动画。样式这块,空间本身有一些属性,然后微信这套设计有一个自己的风格,复制的时候从多个地方扣过来。

navbar.wxss

.weui-navbar {

margin-top: 50px;

display: -webkit-box;

display: -webkit-flex;

display: flex;

position: absolute;

z-index: 500;

top: 0;

width: 100%;

border-bottom: 1rpx solid #ccc;

}

.weui-navbar__item {

position: relative;

display: block;

-webkit-box-flex: 1;

-webkit-flex: 1;

flex: 1;

padding: 13px 0;

text-align: center;

font-size: 0;

}

.weui-navbar__item.weui-bar__item_on {

color: #F5CD79;

}

.weui-navbar__slider {

position: absolute;

content: ;

left: 0;

bottom: 0;

width: 50%;

height: 3px;

background-color: #F5CD79;

-webkit-transition: -webkit-transform 0.3s;

transition: -webkit-transform 0.3s;

transition: transform 0.3s;

transition: transform 0.3s, -webkit-transform 0.3s;

}

.weui-navbar__title {

display: inline-block;

font-size: 15px;

max-width: 8em;

width: auto;

overflow: hidden;

text-overflow: ellipsis;

white-space: nowrap;

word-wrap: normal;

}

.weui-tab__panel {

box-sizing: border-box;

height: 100%;

padding-top: 50px;

overflow: auto;

-webkit-overflow-scrolling: touch;

}

然后就是逻辑navbar.js

var sliderWidth = 96; // 需要设置slider的宽度,用于计算中间位置

Component({

properties: {

// 这里定义了tabs属性,属性值可以在组件使用时指定,类似于react的props

proptype

tabs: {

type: [],

value: [PHOTO1, BLOG1],

}

},

data: {

// 初始化一些默认值ß

activeIndex: 0,

sliderOffset: 0,

sliderLeft: 0

},

created: function () {

//空间被创建时触发

console.log(\'--->navbar Component created\')

var that = this;

wx.getSystemInfo({

success: function (res) {

that.setData({

sliderLeft: (res.windowWidth / that.data.tabs.length - sliderWidth) / 2,

sliderOffset: res.windowWidth / that.data.tabs.length * that.data.activeIndex

});

}

});

},

methods: {

// 按钮行为触发状态机变化

tabClick: function (e) {

this.setData({

sliderOffset: e.currentTarget.offsetLeft,

activeIndex: e.currentTarget.id

});

}

}

});

触发生命周期如图

也是由内向外计算,渲染,加载

f5d9dafebcff1819d38de2764418ea8a.png

主页面调用。首先,先添加引用

{

usingComponents: {

Nav: ../../common/navbar/navbar

}

}

然后在页面里像使用普通控件一样使用就行了

总结:

网上有许多自定义tab的一些方案,无非就是写复杂的viewgroup然后用hidfe show替换或者是改写swipe来实现。

本文的例子更偏向第一种,但是又有像swipe的滑动动画。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的滑块验证组件的 Vue 代码示例: ```vue <template> <div class="slider-verify"> <div class="slider-bar" ref="sliderBar"></div> <div class="slider-button" ref="sliderButton" @mousedown="startDrag"></div> </div> </template> <script> export default { data() { return { isDragging: false, startX: 0, sliderBarWidth: 0, sliderButtonWidth: 0, maxDistance: 0, success: false, }; }, mounted() { this.sliderBarWidth = this.$refs.sliderBar.clientWidth; this.sliderButtonWidth = this.$refs.sliderButton.clientWidth; this.maxDistance = this.sliderBarWidth - this.sliderButtonWidth; }, methods: { startDrag(e) { this.isDragging = true; this.startX = e.clientX; document.addEventListener("mousemove", this.drag); document.addEventListener("mouseup", this.stopDrag); }, drag(e) { if (this.isDragging) { const distance = e.clientX - this.startX; const button = this.$refs.sliderButton; button.style.transform = `translateX(${distance}px)`; if (distance >= this.maxDistance) { this.isDragging = false; button.style.transform = `translateX(${this.maxDistance}px)`; this.success = true; this.$emit("success"); } } }, stopDrag() { if (!this.success) { const button = this.$refs.sliderButton; button.style.transform = "translateX(0)"; } document.removeEventListener("mousemove", this.drag); document.removeEventListener("mouseup", this.stopDrag); this.isDragging = false; }, }, }; </script> <style scoped> .slider-verify { position: relative; width: 300px; height: 50px; margin: 20px auto; } .slider-bar { position: absolute; top: 50%; left: 0; transform: translateY(-50%); width: 100%; height: 4px; background-color: #ddd; } .slider-button { position: absolute; top: 50%; left: 0; transform: translateY(-50%); width: 50px; height: 50px; border-radius: 50%; background-color: #fff; box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); cursor: pointer; transition: transform 0.3s ease-out; } </style> ``` 在这个示例中,我们创建了一个名为 `SliderVerify` 的组件,用于实现滑块验证功能。组件包含一个滑块条和一个滑块按钮,当用户拖动按钮到滑块条的最右侧时,触发验证成功的事件。 组件的主要逻辑在 `startDrag`、`drag` 和 `stopDrag` 方法中实现。`startDrag` 方法在用户按下鼠标左键时被调用,记录鼠标的起始位置和当前正在拖动滑块按钮的状态。`drag` 方法在用户拖动滑块按钮时被调用,根据鼠标的水平位移计算出滑块按钮应该移动的距离,并更新按钮的样式。如果滑块按钮移动到了滑块条的最右侧,触发验证成功的事件。`stopDrag` 方法在用户松开鼠标左键时被调用,根据验证是否成功来恢复滑块按钮的位置。 最后,我们在组件的模板中使用 `ref` 属性来获取滑块条和滑块按钮的 DOM 元素,并通过 CSS 样式来设置它们的外观和布局。在组件中使用 `this.$emit` 方法来触发验证成功的事件,供父组件监听并处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值