自定义组件和父子页面[2](12)

一、父向子传递数据

  • 父页面 通过标签属性来传参
    子页面接受数据
  • 在子组件的js文件的properties: {},存放要从父组件中接受的数据
    格式:数据名:{type:数据类型,value:默认值}
    例如:
    aaa:{ type:String,value:""}
    bbb:{ type:Array,value:[]}在这里插入图片描述
    即可以在父页面中定义数据,然后通过参数传递给子组件,子组件在properties中声明要接受的数据内容,然后即可自由使用父页面传来的数据,把数据当自己的使用

父页面wxml

<Tabs tabs="{{tabs}}"></Tabs>

父页面json

{
  "usingComponents": {
    "Tabs":"../../components/Tabs/Tabs"
  }
}

父页面js

// pages/demo13/demo13.js
Page({

  /**
   * 页面的初始数据
   */
  data: {
    tabs:[
      {
        id:0,
        name:"原创",
        isActive:true
      },
      {
        id:1,
        name:"分类",
        isActive:false
      },
      {
        id:2,
        name:"关于",
        isActive:false
      },
      {
        id:3,
        name:"首页",
        isActive:false
      }
    ]
  }
})

子页面js

// components/Tabs/Tabs.js
Component({
  properties: {
    tabs:{
      type:Array,
      value:[]
    }
  },
  data: {
   
  },
  //存放组件的回调函数,存放在methods下
  //获取被点击的索引,获取原数组,循环,将active改为false
  //为激活项添加选中效果
  methods: {
    handle_item_click(e){
      //因为要获取索引下标,就需要参数
      console.log("点击");
      console.log(e);
      //点击获取点击项的数组下标
      const {index}=e.currentTarget.dataset;
      //获取数组信息
      let {tabs}=this.data;
      //foreach改变active的值
      tabs.forEach((v,i)=>i===index?v.isActive=true:v.isActive=false);
      //将数据设置到页面
      this.setData({tabs})
    }
  }
})

子页面wxml和wxss不再粘贴,见前章节

二、子向父传递数据

写成一中代码后,tabs是父页面的数据,传递到子页面中,let {tabs}=this.data;仍然可以获得数据,是因为父页面将数据拷贝到了子页面,因此父页面执行Tabs标签时仍然可以正常执行,
但如下图所示,点击事件虽然执行了,但数据却没用改变
在这里插入图片描述
this.setData({tabs})这是因为只是把数据设置到本页面的tabs中,但父页面的tabs没有发生变化,因此每次点击事件发生以后,改变的只是子页面的拷贝tabs,父页面tabs没变
格式:this.triggerEvent("父组件自定义事件名",参数)
步骤:
1.在子页面触发父组件中自定义事件,同时传参this.triggerEvent(“父组件自定义事件名”,要传的参数)

// components/Tabs/Tabs.js
Component({
  /**
   * 组件的属性列表
   */
  properties: {
    tabs:{
      type:Array,
      value:[]
    }
  },

  /**
   * 组件的初始数据
   */
  data: {
   
  },
  methods: {
    handle_item_click(e){
      //点击获取点击项的数组下标
      const {index}=e.currentTarget.dataset;
      //触发父组件中自定义事件,同时传参
      this.triggerEvent("item_change",{index});
    }
  }
})

2.在父页面wxml标签中绑定事件

<Tabs tabs="{{tabs}}" binditem_change="handle_item_change"></Tabs>

3.写绑定事件函数(父页面的js)

// pages/demo13/demo13.js
Page({

  /**
   * 页面的初始数据
   */
  data: {
    tabs:[
      {
        id:0,
        name:"原创",
        isActive:true
      },
      {
        id:1,
        name:"分类",
        isActive:false
      },
      {
        id:2,
        name:"关于",
        isActive:false
      },
      {
        id:3,
        name:"首页",
        isActive:false
      }
    ]
  },
  handle_item_change(e){
    //console.log(e);
    const {index}=e.detail;
    let {tabs}=this.data;
    //foreach改变active的值
    tabs.forEach((v,i)=>i===index?v.isActive=true:v.isActive=false);
    //将数据设置到页面
    this.setData({tabs})
  }
})

在js中
= =会先转换类型,然后比较
===必须是相同类型才能比较
=>箭头函数相当于匿名函数,并且简化了函数定义,如果只有一条语句,则不需要写大括号和return,参数都相当于是引用类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值