🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # 1.创建、使用自定义组件 1、创建目录components用于存放组件 2、在components下创建第一个组件目录music,创建完成后,右键目录music,选择创建一个component,输入文件名:music,便得到了四个以music开头的文件 3、在index页面("pages/index/index")使用自定义组件music, 先在index.json文件内注册组件(组件名是可以自定义的,但得找到对应的文件目录) ~~~ { "usingComponents": { "v-music": "/components/music/music" } } ~~~ 4、现在就可以在index.wxml文件使用组件了 ~~~ <v-music></v-music> ~~~ # 2.behavior,组件属性封装 behaviors 是用于组件间代码共享的特性。 每个 behavior 可以包含一组属性、数据、生命周期函数和方法,组件引用它时,它的属性、数据和方法会被合并到组件中,生命周期函数也会在对应时机被调用。每个组件可以引用多个 behavior 。 behavior 也可以引用其他 behavior 。 behavior 需要使用 Behavior() 构造器定义。 ***** 公共属性my-behavior.js ~~~ // my-behavior.js var common = Behavior({ properties:{ title:String, content:String } }) export {common} ~~~ 组件movie.js ~~~ // components/movie/movie.js import {common} from "../my-behavior"; Component({ /** * 组件的属性列表 */ // properties: { // title: String, // content: String // }, behaviors: [common], /** * 组件的初始数据 */ data: { }, /** * 组件的方法列表 */ methods: { } }) ~~~ # 3.自定义组件传参 ## 1.父子传参(页面向组件传参) 例子: ### 1.现在在index.js下data里有一个参数id(id: 1997)需要传递给组件music ~~~ Page({ data: { id: 1997 } }) ~~~ ### 2.在index.wxml给组件定义一个属性来承载参数 > **一旦给组件添加属性,那么若添加的属性想要在组件内使用,必须在组件属性列表(properties:{})内注册** ~~~ <v-music id="{{id}}"></v-music> ~~~ ### 3.在组件music.js注册属性 > **属性注册需要规定数据类型type(必填),也可以给默认值value** ~~~ Component({ /** * 组件的属性列表 */ properties: { /* 简写方式:id: Number */ id: { type: Number } }, /** * 组件的初始数据 */ data: { }, /** * 组件的方法列表 */ methods: { } }) ~~~ ### 4.数据已经传递给了组件,现在可以看下效果了,在music.wxml展示 ~~~ <view>{{id}}</view> ~~~ ## 2.子父传参(组件向页面传参),详细api点击:[链接](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html) 在子组件中定义事件,向父组件传递任意数据 例:现将组件music.js下data内的msg传递给index页面 ### 1.在music.wxml添加点击事件 ~~~ <view bindtap="onShow"> 我是谁? </view> ~~~ ### 2.在music.js方法列表写点击函数 ~~~ Component({ /** * 组件的属性列表 */ properties: { }, /** * 组件的初始数据 */ data: { msg: "you are beautiful" }, /** * 组件的方法列表 */ methods: { onShow(){ var msg = this.data.msg; // 自定义组件触发事件时,需要使用 triggerEvent 方法,指定事件名、detail对象,传递给父组件 this.triggerEvent('message',msg) } } }) ~~~ ### 3.在index.wxml绑定来自组件的事件,并给事件方法名 ~~~ <view class="container"> <v-music bind:message="onMshow"></v-music> </view> ~~~ ### 4.在index.js里便可以得到来自组件传递的参数 ~~~ Page({ data: { }, onMshow(e){ console.log(e.detail); // you are beautiful } }) ~~~ # 4.组件的wxss样式由父节点编写 ### 1.先在组件music.wxml添加class ~~~ <!--components/music/music.wxml--> <view bindtap="onShow" class="tag-class"> 我是谁? </view> ~~~ ### 2.在组件music.js注册 ~~~ // components/music/music.js Component({ /** * 组件的属性列表 */ properties: {}, /* 添加祖册项,向外暴露class */ externalClasses: ['tag-class'], /** * 组件的初始数据 */ data: { msg: "you are beautiful" }, }) ~~~ ### 3.在index.wxml接收来自组件的class名,并在index.wxss设置样式 ~~~ <!-- "pages/index/index.wxml" --> <view class="container"> <v-music bind:message="onMshow" tag-class="font-color"></v-music> </view> ~~~ "pages/index/index.js" ~~~ .font-color{ color: red; } ~~~ # 5.父节点向子组件传递wxml代码(将页面的wxml代码传递到组件) ### 1.在index.wxml添加需要添加到组件的代码 ~~~ <!-- "pages/index/index.wxml" --> <view class="container"> <v-music bind:message="onMshow" tag-class="font-color"> <text slot="after">xhhh</text> </v-music> </view> ~~~ ### 2.在组件music.js设置注册项 ~~~ // components/music/music.js Component({ /** * 组件的属性列表 */ properties: {}, // 设置注册项 options: { multipleSlots: true }, externalClasses: ['tag-class'], /** * 组件的初始数据 */ data: { msg: "you are beautiful" }, }) ~~~ ### 3.在组件music.wxml接收来自父组件的代码段 ~~~ <!--components/music/music.wxml--> <view bindtap="onShow" class="tag-class"> 我是谁? <!-- slot 父节点向子组件传递wxml代码 --> <slot name="after"></slot> </view> ~~~