组件

一:创建组件:组件也是由xml,wss,js,json四个类型文件构成:

taps1.js
// component/taps/taps1.js
Component({
  /**
   * 组件的属性列表
   */
  properties: {

  },

  /**
   * 组件的初始数据
   */
  data: {
    tabs:[
      {
      id:0,
      name:"首页",
      isActive:true
      },
      {
        id:1,
        name: "原创",
        isActive: false
      },
      {
        id:2,
        name: "分类",
        isActive: false
      },
      {
        id:3,
        name: "关于",
        isActive: false
      }
    ] 
     },
  /**
   * 组件的方法列表
   * 
1:页面.js文件中 存放时间回调函数的时候 存放在data同层级下.
2:组件.js文件中 存放事件回调函数的时候 必须要存放在methods中!!!
   */
  methods: {
    /*
     * 
     */
    hand_click(e){
      /*
1:绑定点击事件
2:获取被点击的索引
3:获取原数组
4:对数组循环
    (1):给每一个循环性 选中属性 改为 false
    (2):给 当前的索引的 项 添加激活选中效果就可以了
*/
      //获取索引
      const { index } = e.currentTarget.dataset
      //获取data中的数组.
      /*
      补充:不要直接修改this.data.数据
      let tabs = JSON.parse(JSON.stringify(this.data.tabs));
      */
      let { tabs } = this.data //等价于let tabs = this.data.tabs
      //循环数组 ,注意在这里修改数组list的值会导致原数组值的改变
      tabs.forEach((v, i) => i === index ? v.isActive = true : v.isActive = false)
      this.setData({
        tabs
      })
    }
  }
})
taps1.json
{
  "component": true,
  "usingComponents": {}   //用来配置组件
}
taps1.wxml
<!--component/taps/taps1.wxml-->
<view class="tabs">
<view class="tabs_title">
<view 
wx:for="{{tabs}}"
wx:key = "id"
class="title_item {{item.isActive? 'active': ''}}"
bindtap="hand_click" 
data-index="{{index}}"
> <!--bindtap绑定事件--> 
{{item.name}}
</view>
</view>
<view class="tabs_content">
内容
</view>
</view>
taps1.wxss
/* component/taps/taps1.wxss */
.tabs{
  margin-bottom: 1rpx;
}
.tabs_title{
  display: flex;
  padding: 10rpx;
}
.title_item{
  flex: 1;
  display: flex;
  justify-content: center;
  align-items: center;
}
.active{
  color: red;
  border-bottom: 10rpx solid currentColor;
}
.tabs_content{
  border: solid 1rpx royalblue;
}

二:应用组件的页面:

comp1.js

// pages/component/component.js
Page({

  /**
   * 页面的初始数据
   */
  data: {

  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {

  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {

  }
})

json

{
  "usingComponents": {"Taps":"../../component/taps/taps1"}
}

wxml

<!--pages/component/component.wxml-->
<Taps></Taps>

【看起来就是将一个完整的页面封装成一个组件,然后在json文件中加载,并且为其以json格式做成一个标签,供页面直接使用】

 

三:父向子传递数据,和子向父传递数据:

修改父组件(即当前显示页面).wxml文件

<!--pages/component/component.wxml-->
<!--父组件(当前页面)向子组件传递数据 通过 标签属性的方式来传递
    1:在子组件中进行接收:
    2:在子组件直接使用通过标签属性来传递的值。
-->
<Taps biaoqian_value="在组件中使用"></Taps>

修改组件tabs.js文件

// component/taps/taps1.js
Component({
  /**
   * 组件的属性列表
   */
  properties: {
/*
里面存放的是要从父组件中接收的数据
*/
biaoqian_value:{
    //要接收的数据类型
    type: String,
    value: "" //表示默认值
}
  },

  /**
   * 组件的初始数据
   */
  data: {
    tabs:[
      {
      id:0,
      name:"首页",
      isActive:true
      },
      {
        id:1,
        name: "原创",
        isActive: false
      },
      {
        id:2,
        name: "分类",
        isActive: false
      },
      {
        id:3,
        name: "关于",
        isActive: false
      }
    ] 
     },
  /**
   * 组件的方法列表
   * 
1:页面.js文件中 存放时间回调函数的时候 存放在data同层级下.
2:组件.js文件中 存放事件回调函数的时候 必须要存放在methods中!!!
   */
  methods: {
    /*
     * 
     */
    hand_click(e){
      /*
1:绑定点击事件
2:获取被点击的索引
3:获取原数组
4:对数组循环
    (1):给每一个循环性 选中属性 改为 false
    (2):给 当前的索引的 项 添加激活选中效果就可以了
*/
      //获取索引
      const { index } = e.currentTarget.dataset
      //获取data中的数组.
      /*
      补充:不要直接修改this.data.数据
      let tabs = JSON.parse(JSON.stringify(this.data.tabs));
      */
      let { tabs } = this.data //等价于let tabs = this.data.tabs
      //循环数组 ,注意在这里修改数组list的值会导致原数组值的改变
      tabs.forEach((v, i) => i === index ? v.isActive = true : v.isActive = false)
      this.setData({
        tabs
      })
    }
  }
})

在子组件tabs.wxml文件中使用在页面中通过标签属性传递过来的值

<!--component/taps/taps1.wxml-->
<view>{{biaoqian_value}}</view><!--使用通过标签属性传过来的值-->
<view class="tabs">
<view class="tabs_title">
<view 
wx:for="{{tabs}}"
wx:key = "id"
class="title_item {{item.isActive? 'active': ''}}"
bindtap="hand_click" 
data-index="{{index}}"
> <!--bindtap绑定事件--> 
{{item.name}}
</view>
</view>
<view class="tabs_content">
内容
</view>
</view>

 

在一次修改:

(1):将原来组件中的data属性中的tabs数组复制到父组件(页面)中.

comp1.js

// pages/component/component.js
Page({

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

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {

  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {

  }
})

在修改父组件的xml文件

<!--pages/component/component.wxml-->
<!--父组件(当前页面)向子组件传递数据 通过 标签属性的方式来传递
    1:在子组件中进行接收:
    2:在子组件直接使用通过标签属性来传递的值。
-->
<!--<Taps biaoqian_value="在组件中使用"></Taps>-->
<!--和上面的例子是一样的机制-->
<Taps tabs="{{tabs}}"></Taps>

最后在组件中进行接收父组件通过标签属性传递过来的值

// component/taps/taps1.js
Component({
  /**
   * 组件的属性列表
   */
  properties: {
/*
里面存放的是要从父组件中接收的数据
*/
/*
biaoqian_value:{
    //要接收的数据类型
    type: String,
    value: "" //表示默认值
}
*/
tabs:{                     【就是这个数组】
  type:Array,
  value:""
}
  },

  /**
   * 组件的初始数据
   */
  data: {
    /*
    tabs:[
      {
      id:0,
      name:"首页",
      isActive:true
      },
      {
        id:1,
        name: "原创",
        isActive: false
      },
      {
        id:2,
        name: "分类",
        isActive: false
      },
      {
        id:3,
        name: "关于",
        isActive: false
      }
    ] 
    */
     },
  /**
   * 组件的方法列表
   * 
1:页面.js文件中 存放时间回调函数的时候 存放在data同层级下.
2:组件.js文件中 存放事件回调函数的时候 必须要存放在methods中!!!
   */
  methods: {
    /*
     * 
     */
    hand_click(e){
      /*
1:绑定点击事件
2:获取被点击的索引
3:获取原数组
4:对数组循环
    (1):给每一个循环性 选中属性 改为 false
    (2):给 当前的索引的 项 添加激活选中效果就可以了
*/
      //获取索引
      const { index } = e.currentTarget.dataset
      //获取data中的数组.
      /*
      补充:不要直接修改this.data.数据
      let tabs = JSON.parse(JSON.stringify(this.data.tabs));
      */
      let { tabs } = this.data //等价于let tabs = this.data.tabs
      //循环数组 ,注意在这里修改数组list的值会导致原数组值的改变
      tabs.forEach((v, i) => i === index ? v.isActive = true : v.isActive = false)
      this.setData({
        tabs
      })
    }
  }
})

 

posted @ 2020-05-03 08:53  calm寻路人  阅读(137)  评论(0编辑  收藏  举报