4.自定义组件
自定义组件方法
2.子向父传递数据
- 创建components文件夹,创建component自定义组件
- 新增组件:在json文件“usingComponents”使用组件(键值对)例子:"Tabs" : "../../componets/Tabs/Tabs"。
-
使用组件:json引用组件对应的xml文件中,看做普通标签使用
。 - 页面.js 文件中 存放事件回调函数的时候 存放在data同层级下!!!
- 组件.js 文件中 存放事件回调函数的时候 必须存放在 methods中!!!
/** * 1.页面.js 文件中 存放事件回调函数的时候 存放在data同层级下!!! * 2.组件.js 文件中 存放事件回调函数的时候 必须存放在 methods中!!! */ methods: { hanldeItemTap(e){ /** * 1、绑定事件 需要在methods中绑定; * 2、获取被点击的索引 * 3、获取原数组 * 4、对数组循环:给每个循环项,选中属性改为false;给当前的索引项添加激活效果 */ //获取索引 const {index}=e.currentTarget.dataset; //获取data中的数组 //解构:对复杂类型进行结构的时候 复制一份 变量引用而已 //最严谨的做法:重新拷贝一份数组,再对这个数组的备份进行处理:let tabs = JSON.parse(JSON.stringify(this.data.tabs)) //不要直接修改 this.data.数据 //最严谨的做法 let {tabs} = this.data; //相同于 let tabs = this.data.tabs; //循环数组 //[].forEach 遍历数组的时候,修改了v,也会导致原数组被修改 tabs.forEach((v,i) =>i===index?v.isActive=true:v.isActive=false); this.setData({ tabs }) } }2.父向子传递数据
- 父组件(页面)向子组件传递数据,通过标签属性的方式来传递
- 在子组件上进行接收 properties,把这个数据当成是data中的数据用即可
//页面(父组件)使用的组件
/** * 子组件.js接收的数据 */ properties: { //要接收的数据名称 aaa:{ //type 要接收的数据类型 type:String, //value 没有传值的默认值 value:"" } },
/** * 子组件.wxml直接赋值 */传的数据{{aaa}}
2.子向父传递数据
- 子向父传递数据 通过事件的方式传递的:在页面的子组件的标签上加入一个 自定义事件
//页面(父组件)使用的组件
/** * 父组件.js */ //自定义事件 用来接收子组件传递的数据 handelItemChange(e){ const {index} = e.detail; let {tabs} = this.data; tabs.forEach((v,i) =>i===index?v.isActive=true:v.isActive=false); this.setData({ tabs }); }
3.自定义组件-slot
/** * 子组件.js接收的数据 */ properties: { //要接收的数据名称 tabs:{ //type 要接收的数据类型 type:Array, //value 没有传值的默认值 value:[] } }, /** * 1.页面.js 文件中 存放事件回调函数的时候 存放在data同层级下!!! * 2.组件.js 文件中 存放事件回调函数的时候 必须存放在 methods中!!! */ methods: { hanldeItemTap(e){ /** * 1、绑定事件 需要在methods中绑定; * 2、获取被点击的索引 * 3、获取原数组 * 4、对数组循环:给每个循环项,选中属性改为false;给当前的索引项添加激活效果 * 5、点击事件触发的时候:触发组件的自定义事件,同时传递数据过去到父组件 * this.triggerEvent("父组件自定义事件的名称",要传递的参数) */ //获取索引 const {index}=e.currentTarget.dataset; this.triggerEvent("itemChange",{index}); //获取data中的数组 //解构:对复杂类型进行结构的时候 复制一份 变量引用而已 //最严谨的做法:重新拷贝一份数组,再对这个数组的备份进行处理:let tabs = JSON.parse(JSON.stringify(this.data.tabs)) //不要直接修改 this.data.数据 //最严谨的做法 //let {tabs} = this.data; //相同于 let tabs = this.data.tabs; //循环数组 //[].forEach 遍历数组的时候,修改了v,也会导致原数组被修改 // tabs.forEach((v,i) =>i===index?v.isActive=true:v.isActive=false); // this.setData({ // tabs // }) } }
//在子组件.wxml里 <view class="tabs_content"> <slot>slot> view>
//在(页面)父组件.wxml里 <Tabs tabs="{{tabs}}" binditemChange="handelItemChange"> <block wx:if="{{tabs[0].isActive}}">1block> <block wx:elif="{{tabs[1].isActive}}">2block> <block wx:elif="{{tabs[2].isActive}}">3block> <block wx:else="{{tabs[3].isActive}}">4block> Tabs>