微信小程序自定义组件的封装与使用

这篇博客给刚接触微信小程序的新手们,说说微信小程序里面的自定义组件的封装与使用 ,代码如下:

首先咱们要在miniprogram的文件夹里新建一个componets文件夹,然后在里面新建一个自定义的组件文件夹,里面要包含index.js,index.json,index.wxml,index.wxss四个文件

父组件:

index.wxml: 

<view wx:if="{{!nickname }}" class="username" bind:tap="toSetting">点击授权登录</view>  
<cloud-tip-modal bindmyevent="myevent" showUploadTipProps="{{showUploadTip}}" />

index.js:

const {
  envList
} = require('../../envList');
const db = wx.cloud.database();
const app = getApp();
// pages/me/index.js
Page({
  /**
   * 页面的初始数据
   */
  data: {
    openId: '',
    showUploadTip: false,
    nickname: '',
    avatar: ''
  },
  toSetting() {
    this.setData({
      showUploadTip: true
    })
  },
  myTask() {
    wx.navigateTo({
      url: `/pages/task/index`,
    });
  },
  async myevent(e) {
    const {
      avatar,
      nickname
    } = e.detail;
    let cloudPath = "nickimg/" + new Date().getTime() + "-" + Math.floor(Math.random() * 1000) + '.png';
    const avatarUrl = await this.uploadFile(cloudPath, avatar);
    let userInfo = {
      avatar: avatarUrl.fileID,
      nickname: nickname
    }
    db.collection('users').where({
      _openid: app.globalData.openid
    }).update({
      data: {
        ...userInfo
      }
    })
    console.log("users表更新成功");
    app.globalData.nickname = nickname;
    app.globalData.avatar = avatarUrl.fileID;
    this.setData({
      nickname: nickname,
      avatar: avatarUrl.fileID
    })
  }
});

子组件:

index.html:

<!--miniprogram/components/cloudTipModal/index.wxml-->
<view class="install_tip" wx:if="{{showUploadTip}}">
  <view class="install_tip_back"></view>
  <view class="install_tip_detail" bindmyevent="myevent">
    <button class="avatar-wrapper " open-type="chooseAvatar" bind:chooseavatar="onChooseAvatar">
      <image class="avatar" src="{{avatar}}"></image>
    </button>
    <input type="nickname" class="weui-input" placeholder="点击获取昵称" bindblur="bindblur" value="{{nickname}}" />
    <view class="choose">
      <button class="no" bind:tap="no">取消</button>
      <button class="yes" bind:tap="yes">确定</button>
    </view>
  </view>
</view>

index.wxss:

.avatar{
  margin-bottom: 10px;
  /* border: solid; */
  width: 100px;
  height: 100px;
}
.weui-input{
  /* border: solid; */
  display: flex;
  width: 25%;
  margin-left: 125px;
  height: 30px;
}
.choose{
  width: 100%;
  display: flex;
}
.yes{
  flex: 1;
  width: 30%;
  height: 30px;
}
.no{
  flex: 1;
  width: 30%;
  height: 30px;
}
.install_tip_back {
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  background-color: rgba(0,0,0,0.4);
  z-index: 1;
}

.install_tip_detail {
  position: fixed;
  display: flex;
  text-align: center;
  /* justify-content: center; */
  flex-direction: column;
  background-color: white;
  right: 0;
  bottom: 0;
  left: 0;
  top: 60%;
  border-radius: 40rpx 40rpx 0 0;
  padding: 50rpx;
  z-index: 9;
}

.install_tip_detail_title {
  font-weight: 400;
  font-size: 40rpx;
  text-align: center;
}

.install_tip_detail_tip {
  font-size: 25rpx;
  color: rgba(0,0,0,0.4);
  margin-top: 20rpx;
  text-align: center;
}

.install_tip_detail_shell {
  margin: 70rpx 0;
  display: flex;
  justify-content: center;
}

.install_tip_detail_copy {
  color: #546488;
  margin-left: 10rpx;
}

.install_tip_detail_button {
  color: #07C160;
  font-weight: 500;
  background-color: rgba(0,0,0,0.1);
  width: 60%;
  text-align: center;
  height: 90rpx;
  line-height: 90rpx;
  border-radius: 10rpx;
  margin: 0 auto;
}

index.js:

// miniprogram/components/cloudTipModal/index.js
const { isMac } = require('../../envList.js');

Component({

  /**
   * 页面的初始数据
   */
  data: {
    showUploadTip: false,
    tipText: isMac ? 'sh ./uploadCloudFunction.sh' : './uploadCloudFunction.bat',
    avatar:'../../images/icons/avatar.png',
    nickname:'',
    nicknameError:false,
  },
  properties: {
    showUploadTipProps: Boolean
  },
  observers: {
    showUploadTipProps: function(showUploadTipProps) {
      this.setData({
        showUploadTip: showUploadTipProps
      });
    }
  },
  methods: {
    onChooseAvatar(e) {
      const { avatarUrl } = e.detail;
      this.setData({
        avatar: avatarUrl
      })
    },
    bindblur(res){
      const value = res.detail.value;
      this.data.nickname = value;
    },
    onInput(e) {
      // console.log("nickname=="+e.detail.value);
      let value = e.detail.value;
      if (value.length>10) {
        value = value.slice(0,10);
        this.setData({
          nickname: e.detail.value,
          nicknameError:true
        });
      }else{
        this.setData({
          nickname: value,
          nicknameError:false
        });
      }
    },
    no(){
      this.setData({
        showUploadTip: false
      });
    },
    yes(){
      const {avatar,nickname} = this.data;
      this.triggerEvent('myevent',{
        avatar,
        nickname
      });
      this.setData({
        showUploadTip: false
      });
    },
    onChangeShowUploadTip() {
      this.setData({
        showUploadTip: !this.data.showUploadTip
      });
    },
    copyShell() {
      wx.setClipboardData({
        data: this.data.tipText,
      });
    },
  }

});

index.json:

{
  "usingComponents": {},
  "component": true
}

 能看懂代码的兄弟,直接把代码拿走就好,稍有疑惑的兄弟,我来解释一下这个逻辑和注意点

这里主要展示的是一个登录功能:

首先,我们在父组件里点击授权登录就会触发toSetting()函数,把showUploadTip的值从false改成true,那么通过showUploadTipProps就可以把对应的showUploadTip值传到子组件里,

  observers: {

    showUploadTipProps: function(showUploadTipProps) {

      this.setData({

        showUploadTip: showUploadTipProps

      });

    }

  },

子组件里的这段代码接收到showUploadTipProps的值并且赋值给showUploadTip,<view class="install_tip" wx:if="{{showUploadTip}}">那么对应的组件页面就会展现出来,

    yes(){

      const {avatar,nickname} = this.data;

      this.triggerEvent('myevent',{

        avatar,

        nickname

      });

      this.setData({

        showUploadTip: false

      });

    },

然后点击触发yes()函数的话,通过触发事件绑定myevent,通过<view class="install_tip_detail" bindmyevent="myevent">把对应的值传到父组件的myevent,

async myevent(e) {

    const {

      avatar,

      nickname

    } = e.detail;

    let cloudPath = "nickimg/" + new Date().getTime() + "-" + Math.floor(Math.random() * 1000) + '.png';

    const avatarUrl = await this.uploadFile(cloudPath, avatar);

    let userInfo = {

      avatar: avatarUrl.fileID,

      nickname: nickname

    }

    db.collection('users').where({

      _openid: app.globalData.openid

    }).update({

      data: {

        ...userInfo

      }

    })

    console.log("users表更新成功");

    app.globalData.nickname = nickname;

    app.globalData.avatar = avatarUrl.fileID;

    this.setData({

      nickname: nickname,

      avatar: avatarUrl.fileID

    })

  },

 然后把对应的传过来的参数值进行操作即可。这里面的部分代码可能有些冗余,大家理解之后删除即可。

希望这些对你有所帮助,如果你也觉得有用的话,欢迎点赞收藏呦,方便下次查阅

 

 

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
微信小程序是一种基于微信平台的应用程序,它可以在微信中直接运行,无需下载安装。而自定义组件小程序中的一种重要功能,它允许开发者将一些常用的UI元素封装成组件,以便在不同的页面中复用。 自定义组件具有以下特点: 1. 组件是由wxml、wxss和js文件组成,可以独立定义样式和逻辑。 2. 组件可以接受外部传入的数据,通过属性进行配置。 3. 组件可以触发事件,向外部传递消息。 4. 组件可以包含子组件,形成组件的嵌套结构。 使用自定义组件的步骤如下: 1. 在小程序项目中创建一个新的文件夹,用于存放自定义组件的相关文件。 2. 在该文件夹中创建一个wxml文件,定义组件的结构。 3. 在同一文件夹中创建一个wxss文件,定义组件的样式。 4. 在同一文件夹中创建一个js文件,定义组件的逻辑。 5. 在需要使用该组件的页面中引入组件,并在wxml中使用组件标签。 例如,我们创建一个名为"custom-component"的自定义组件,其文件结构如下: ``` custom-component/ ├── custom-component.wxml ├── custom-component.wxss └── custom-component.js ``` 在custom-component.wxml中定义组件的结构,例如: ```html <view class="custom-component"> <text>{{text}}</text> <button bindtap="handleClick">点击按钮</button> </view> ``` 在custom-component.wxss中定义组件的样式,例如: ```css .custom-component { background-color: #f5f5f5; padding: 10px; } ``` 在custom-component.js中定义组件的逻辑,例如: ```javascript Component({ properties: { text: { type: String, value: '默认文本' } }, methods: { handleClick() { this.triggerEvent('click', { message: '按钮被点击了' }); } } }) ``` 在需要使用该组件的页面中引入组件,并在wxml中使用组件标签,例如: ```html <custom-component text="Hello World" bind:click="handleCustomComponentClick"></custom-component> ``` 以上就是微信小程序自定义组件的简单介绍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

起飞001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值