微信小程序自定义组件

一.什么是自定义组件

类似于页面,自定义组件拥有自己的 wxml 模板和 wxss 样式,组件模板的写法与页面模板相同。组件模板与组件数据结合后生成的节点树,将被插入到组件的引用位置上。在组件模板中可以提供一个 <slot> 节点,用于承载组件引用时提供的子节点。

二、如何编写自定义组件

自定义组件和普通页面一样,都有wxml、wxss、json、js文件,不同的是对于自定义的组件,需要在json配置文件中声明为一个组件,另外在组件模板中可以提供一个slot节点,用于承载组件引用时提供的子节点。

1、定义wxml文件

/*child*/
<!-- 组件模板 -->
<view class="wrapper">
  <view>这里是组件的内部节点</view>
  <slot></slot>/*用于承载组件引用时提供的子节点,就是在引用页面的组件内编写的标签内容,将被传递在slot的位置》*/
</view>

2、修改自定义组件的json文件

{
  "component": true,//将组件定义为true
  "usingComponents": {}
}

三、如何引用编写的自定义组件

1、修改引用页面的json文件

{
  "usingComponents": {
    "component-child": "/components/component-tag-name"/*将刚才编写的组件引用过来,注意自定义组件的路径,同时定义组件名称为component-child*/
  }
}

2、在wxml文件中引用自定义组件

/*parent*/
<view>
  <component-child>
    <!-- 这部分内容将被放置在组件 <slot> 的位置上 -->
    <view>这里是插入到组件slot中的内容</view>
  </component-child>
</view>

四、如何向自定义组件传递数据

与普通的 WXML 模板类似,可以使用数据绑定,这样就可以向子组件的属性传递动态数据。

为便于理解以下引用页面称为父页面,自定义组件称为子页面。

1、父页面定义传递的变量

注意在向子页面传递数据的父页面,此处的红框内的属性名为向自定义组件child传递数据的属性名,父页面向子页面传递数据其实有两个过程。

1、父页面的数据绑定由js渲染至前端页面,就是将绿色的框内的值传递给红色框的属性。

2、红色框的属性将值传递给子页面js中的properties(在子页面的properties对象中定义接收变量,注意properties中的变量名须与父页面中传递变量的属性名一致(上图中的红色框的名),否则无法成功接收数据

3、子页面渲染properties中的属性。

2、子页面接收从父页面传递过来的值

<!--子页面的js,child.js-->
Component({
  /**
   * properties用于接收从父页面传递过来的变量,
注意定义的变量名要与父页面传递过来的变量名一致。
   */
  properties:{
    name: {
      type:String,
      value:"小明"//可以定义默认值value,此处虽然默认值为value,但是父页面同样传递过来一个name,将默认值小明覆盖。
    },
    age:Number
  },

  /**
   * 组件的初始数据
   */
  data: {

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

  }
})
<--child.wxml渲染从父页面传递过来的数据-->
<view class="wrapper">
  <view>这里是组件的内部节点</view>
  <text>name: {{name}}</text>
  <text>age: {{age}}</text>
  <slot></slot>
</view>

 五、自定义组件的slot

在组件的 wxml 中可以包含 slot 节点,用于承载组件使用者提供的 wxml 结构(父页面在引用自定义组件时,组件中的wxml结构将显示在slot的位置)。默认情况下,一个组件的 wxml 中只能有一个 slot 。需要使用多 slot 时,可以在组件 js 中声明启用。

1、声明启用多个slot

<!--child.js-->
Component({
  /**
   * 组件的属性列表
   */
  options: {
    multipleSlots: true // 在组件定义时的选项中启用多slot支持
  },
  properties: {
    name: {
      type:String,
      value:"小明"
    },
    age:Number
  }
})

2、使用不同的name来区分slot

<!--child.wxml-->
<view class="wrapper">
  <slot name="before"></slot>
  <view>这里是组件的内部细节</view>
  <slot name="after"></slot>
</view>
<!--parent.wxml-->
<view>
  <component-tag-name>
    <!-- 这部分内容将被放置在组件 <slot name="before"> 的位置上 -->
    <view slot="before">这里是插入到组件slot name="before"中的内容</view>
    <!-- 这部分内容将被放置在组件 <slot name="after"> 的位置上 -->
    <view slot="after">这里是插入到组件slot name="after"中的内容</view>
  </component-tag-name>
</view>

六、关于自定义组件的样式

组件对应 wxss 文件的样式,只对组件wxml内的节点生效。编写组件样式时,需要注意以下几点:

  • 组件和引用组件的页面不能使用id选择器(#a)、属性选择器([a])和标签名选择器(否则会导致父页面和子页面的标签样式同时生效),请改用class选择器。
  • 组件和引用组件的页面中使用后代选择器(.a .b)在一些极端情况下会有非预期的表现,如遇,请避免使用。
  • 子元素选择器(.a>.b)只能用于 view 组件与其子节点之间,用于其他组件可能导致非预期的情况。
  • 继承样式,如 font 、 color ,会从组件外继承到组件内。
  • 除继承样式外, app.wxss 中的样式、组件所在页面的的样式对自定义组件无效(除非更改组件样式隔离选项)。
微信小程序是一种基于微信平台的应用程序,它可以在微信中直接运行,无需下载安装。而自定义组件是小程序中的一种重要功能,它允许开发者将一些常用的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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值