微信小程序-Components自定义组件/数据交互

需求:重复使用相似的组件,如头像框

为了避免重复敲代码,可以自己新建自定义组件。


1.新建Compinents组件

新建components文件夹之后,再右键新建Component,输入名字系统会自动生成四个相应名字的文件,和pages里面一样的。

2. 搭建基本组件

user_avatar.wxml中添加组件结构

<view class="user_avatar">
    <image class="user_avatar_right" mode="scaleToFill" src="{
   
   {user[0].advatar}}"></image>
    <view class="user_avatar_left">
            <view class="user_avatar_name" >{
   
   {user[0].name}}</view>
            <view class="user_avatar_introduce">{
   
   {user[0].introduce}}</view>
        </view>
  </view>

user_avatar.wxss中添加组件样式

.user_avatar{
  margin-top: 150rpx;
  width: 100%; 
  height: 80rpx;
  display:flex;
  padding: 20rpx 20rpx 20rpx 20rpx;
 
}
.user_avatar_right {
  width: 20%; 
  width: 80rpx;
  height: 80rpx;
  border-radius: 50%; 
  overflow: hidden;
}
.user_avatar_left {
  width: 80%; 
  height: 80rpx;
  margin-left: 22rpx;
  /* background-color: orange; */
}
.user_avatar_name {
  margin-top: 8rpx;
  font-family:'Gill Sans', 'Gill Sans MT', Calibri, 'Trebuchet MS', sans-serif;
  font-weight:500;
  font-size: 14px;
  
}
.user_avatar_introduce {
  margin-top: 6rpx;
  font-size: 10px;
  color: #C0C0C0;
}

 在user_avatar.js中添加数据逻辑3

Component({
  /**
   * 组件的属性列表
   */
  properties: {
   
  },
  /**
   * 组件的初始数据
   */
  data: {
    user:[{
      id:'1',
      name:'我在人间迷路', 
      introduce:'希望听歌的人和夜晚的星星都没有意外',
      advatar:'/icon/head/1.jpeg'
    }]
  },

  /**
   * 组件的方法列表
   */
  methods: {

  }
})

3. 插入组件 

在页面的 .json 中进行声明:(其中user_avatar是我们添加的组件名称(就相当于view),可以自己定义)

 "usingComponents": {
    "user_avatar": "/components/user_avatar/user_avatar"
  },

 然后在某个页面的 .wxml 引入组件就可以了,像插入view一样

<user_avatar></user_avatar>

 就能完成需求了


新需求:在帖子页里面引入组件,每个组件需要显示该用户的头像名字等数据。

在之前的组件里面是把头像名字写死了的,如果需要显示不同的数据,需要让组件和页面之间进行交互。

方法1:page > component

page 在引用组件时能通过属性值设置,组件.jsproperties 获取:

组件部分

//组件的.js文件里面

Component({
  /**
   * 组件的属性列表
   */
  properties: {
    id:{
      type:Number,
      value:'1'
    },
    name:{
      type:String,             //类型
      value:'我在人间迷路'     //默认值
    },
    introduce:{
      type:String,
      value:'希望听歌的人和夜晚的星星都没有意外'
    },
    advatar:{
      type:String,
      value:'/icon/head/1.jpeg'
    }
/*
id: String,
name:String      //简写,只需要提供类型,没有默认值
*/
   
  },

 attached: function() {
    console.log("this.properties.name:" + this.properties.name);
  },

  /**
   * 组件的初始数据
   */
  data: {
    user:[{
      id:'1',
      name:'我在人间迷路', 
      introduce:'希望听歌的人和夜晚的星星都没有意外',
      advatar:'/icon/head/1.jpeg'
    }]
  },

// 组件的.wxml文件
<view class="user_avatar">
    <image class="user_avatar_right" mode="scaleToFill" src="{
   
   {advatar}}"></image>
    <view class="user_avatar_left">
            <view class="user_avatar_name" >{
   
   {name}}</view>
            <view class="user_avatar_introduce">{
   
   {introduce}}</view>
        </view>
  </view>


页面部分 

//页面.js,从服务器获取的数据

data: {
    user:[{
      id:'1',
      name:'我在人间迷路',
      introduce:'希望听歌的人和夜晚的星星都没有意外',
      advatar:'/icon/head/1.jpeg',
    },{
      id:2,
      name:'寄给二十一号的信',
      introduce:'我想做一朵安静的流云,被风吹成你喜欢的样子。',
      advatar:'/icon/head/2.jpeg',
    },{
      id:3,
      name:'等日落热吻',
      introduce:'最美好的事,是看到某人的微笑;更美好的事,是他因你而笑',
      advatar:'/icon/head/3.jpeg',
    },{
      id:4,
      name:'心远即安',
      introduce:'不够成熟也不够幼稚,没有能力却有野心',
      advatar:'/icon/head/4.jpeg',
    }],

从服务器得到数据之后,需要在这个页面的自定义组件上把我们的数据渲染上去。

在后面直接通过属性值传给组件就行了

//页面的.wxml
<scroll-view class="scrollview" scroll-y="true">

 <user_avatar class="user_avatar" wx:for="user" wx:key="id" id="{
   
   {user[index].id}}" advatar="{
   
   {user[index].advatar}}" name="{
   
   {user[index].name}}" introduce="{
   
   {user[index].introduce}}"></user_avatar>

</scroll-view>

结果 

 还有两种方法

1.page在引用组件时通data-xxx设置,callphone.js在this.dataset获取

2. component > page

组件中的变量要传到page页面,可以通过事件触发this.triggerEvent()来实行

猜你喜欢

转载自blog.csdn.net/weixin_44422853/article/details/124806063