码迷,mamicode.com
首页 > 其他好文 > 详细

模板template绑定事件和自定义组件Component二级联动

时间:2018-01-27 13:49:44      阅读:476      评论:0      收藏:0      [点我收藏+]

标签:lis   艺术   https   没有   linear   需求   line   options   ==   

一开始接触模板template和自定义组件component时,一直有一个疑问:他们之间有什么不同,不都是用于不同页面的复用吗?

看完文档,做完demo之后便有了一丝丝的理解:自定义组件component拥有自己的wxss和js,而模板template可以说只有wxml吧,但是把他改造成component这样也可以,就是这样,建立一个完整的template,里面有js,wxml,wxss文件,但是在页面引用模板之后,还需要在页面的wxss文件里面引用模板的wxss。总体感觉,component更适合做比较复杂,有交互的组件;template只适合做一些简单的wxml代码复用。

技术分享图片

 

下面分别介绍模板template绑定事件和自定义组件Component 二级联动之行业选择。

模板template绑定事件:其实就是把方法抽出来,写在checkTemp.js上,页面需要用的时候再注册一下。

checkTemp.js代码:
let temp = { bindKeyInput:function(e){ console.log(e); } } export default temp;

在页面怎么引用呢?

import tempObj from ‘../../temp/formTemp/formTemp‘
var indexObj = {
    
}
indexObj["bindKeyInput"] = tempObj.bindKeyInput;
Page(indexObj);

 

自定义组件Component 二级联动之行业选择:项目有个需求,输入表单中有一个行业选择功能,就是一个二级联动选择行业,如下图。

技术分享图片

上网找了一下都没有找到,所以自己就写了一个,顺便学学自定义组件。

我总结一下关键的代码:

secondLink.wxml代码:

<!--pages/components/secondLink/secondLink.wxml-->
  <!--行业选择  -->
  <view class="commodity_screen" catchtap="_hideEvent" wx:if="{{showModalStatus}}"></view>
  <view class="commodity_attr_box" animation="{{animationData}}" wx:if="{{showModalStatus}}" style=‘height:70%;‘>
      <!--确定按钮  -->
      <view class=‘choose-tip‘ style=‘height:10%;‘>请选择所属行业</view>
      <view class=‘scroll‘ style=‘height:90%;‘>
          <scroll-view scroll-y  class=‘scroll-view‘ style=‘height:100%;‘>
            <view wx:for="{{list}}" wx:key="{{item.left}}" class="scroll-view-item {{currentTab==index?‘scroll-active‘:‘‘}}" data-current="{{index}}" catchtap=‘_swichNav‘>{{item.left}}</view>
          </scroll-view>
          <scroll-view scroll-y class=‘scroll-view‘ style=‘height:100%;‘>
            <view  class="scroll-view-item " wx:for="{{list[currentTab].right}}" wx:key="{{*this}}" data-current=‘{{index}}‘ catchtap=‘_chooseEvent‘>{{item}}</view>
          </scroll-view>
      </view>
  </view>

secondLink.js代码;

// pages/components/secondLink/secondLink.js
Component({
  options: {
    multipleSlots: true // 在组件定义时的选项中启用多slot支持
  },
  /**
   * 组件的属性列表
   */
  properties: {
    list: { // 属性名
      type: Array,     // 类型(必填),目前接受的类型包括:String, Number, Boolean, Object, Array, null(表示任意类型)
      value: [
        {
          "id": 1,
          "left": "计算机/互联网/通信/电子",
          "right": [
            "计算机软件",
            "计算机硬件",
            "计算机服务(系统、数据服务、维修)",
            "通信/电信/网络设备",
            "通信/电信运营、增值服务",
            "互联网/电子商务",
            "网络游戏",
            "电子技术/半导体/集成电路",
            "仪器仪表/工业自动化"
          ]
        },
        {
          "id": 2,
          "left": "会计/金融/银行/保险",
          "right": [
            "会计/审计",
            "金融/投资/证券",
            "银行",
            "保险",
            "信托/担保/拍卖/典当"
          ]
        },
        {
          "id": 3,
          "left": "贸易/消费/制造/营运",
          "right": [
            "贸易/进出口",
            "批发/零售",
            "快速消费品(食品、饮料、化妆品)",
            "服装/纺织/皮革",
            "家具/家电/玩具/礼品",
            "奢侈品/收藏品/工艺品/珠宝",
            "办公用品及设备",
            "机械/设备/重工",
            "汽车及零配件"
          ]
        },
        {
          "id": 4,
          "left": "制药/医疗",
          "right": [
            "制药/生物工程",
            "医疗/护理/卫生",
            "医疗设备/器械"
          ]
        },
        {
          "id": 5,
          "left": "广告/媒体",
          "right": [
            "广告",
            "公关/市场推广/会展",
            "影视/媒体/艺术/文化传播",
            "文字媒体/出版",
            "印刷/包装/造纸"
          ]
        },
        {
          "id": 6,
          "left": "房地产/建筑",
          "right": [
            "房地产",
            "建筑/建材/工程",
            "家居/室内设计/装潢",
            "物业管理/商业中心"
          ]
        },
        {
          "id": 7,
          "left": "专业服务/教育/培训",
          "right": [
            "中介服务",
            "租赁服务",
            "专业服务(咨询、人力资源、财会)",
            "外包服务",
            "检测,认证",
            "法律",
            "教育/培训/院校",
            "学术/科研"
          ]
        },
        {
          "id": 8,
          "left": "服务业",
          "right": [
            "餐饮业",
            "酒店/旅游",
            "娱乐/休闲/体育",
            "美容/保健",
            "生活服务"
          ]
        },
        {
          "id": 9,
          "left": "物流/运输",
          "right": [
            "交通/运输/物流",
            "航天/航空"
          ]
        },
        {
          "id": 10,
          "left": "能源/原材料",
          "right": [
            "石油/化工/矿产/地质",
            "采掘业/冶炼",
            "电气/电力/水利",
            "新能源",
            "原材料和加工"
          ]
        },
        {
          "id": 11,
          "left": "政府/非营利组织/其他",
          "right": [
            "政府/公共事业",
            "非营利组织",
            "环保",
            "农/林/牧/渔",
            "多元化业务集团公司"
          ]
        }
      ], // 属性初始值(可选),如果未指定则会根据类型选择一个
      observer: function (newVal, oldVal) { } // 属性被改变时执行的函数(可选),也可以写成在methods段中定义的方法名字符串, 如:‘_propertyChange‘
    }
  },

  /**
   * 组件的初始数据
   */
  data: {
    showModalStatus: false,
    currentTab:0,
    animationData:""
  },

  /**
   * 组件的方法列表
   */
  methods: {
   // 隐藏弹窗
    hideSecond() {
      this.setData({
        showModalStatus: false
      })
    },

    //展示弹窗
    showSecond() {
      var animation = wx.createAnimation({
        duration: 200,
        timingFunction: "linear",
        delay: 0
      })
      this.animation = animation
      animation.translateY(300).step()
      this.setData({
        animationData: animation.export(),
        showModalStatus: true
      })
      setTimeout(function () {
        animation.translateY(0).step()
        this.setData({
          animationData: animation.export()
        })
      }.bind(this), 200)
    },

    // 内部方法建议以下划线开头
    _hideEvent(){
      this.triggerEvent("hideEvent")
    },
    _swichNav(e){
      this.setData({
        currentTab: e.currentTarget.dataset.current
      })
      this.triggerEvent("swichEvent")
    },
    _chooseEvent(e){
      this.hideSecond();
      let profession = this.data.list[this.data.currentTab].right[e.currentTarget.dataset.current];
      this.triggerEvent("chooseEvent", profession);//把profession传到组件之外
    }
  }
})
triggerEvent:触发事件,this.triggerEvent("chooseEvent", profession);可以把组件里面的数据profession传到组件之外。

在index.json设置引用组件:

{
  "usingComponents": {
    "second": "../components/secondLink/secondLink"
  }
}

index.js代码:

  onReady(){
    //获得second组件
    this.second = this.selectComponent("#second");
  },
  // 展示弹窗
  showSecond(){
    this.second.showSecond();
  },
  // 隐藏弹窗
  _hideModal(){
    this.second.hideSecond();
  },
  // 第一步:选择了行业大类
  _swichNav() {
    this.second.swichNav();
  },
  // 最后确定选择了哪一个行业
  chooseItem(e){
    // console.log(e.detail);
    this.setData({
      profession: e.detail
    })
  },

最后在index.html引用即可:

    <second id="second"
    bind:hideEvent = "_hideModal"
    bind:swichEvent = "_swichNav"
    bind:chooseEvent = "chooseItem">
      
    </second>  

list的数据没有填,使用默认的,默认的数据我已经在secondList.js写好,是爬某招聘网的数据。

完整代码:https://github.com/chenweihuan/secondList

模板template绑定事件和自定义组件Component二级联动

标签:lis   艺术   https   没有   linear   需求   line   options   ==   

原文地址:https://www.cnblogs.com/weihuan/p/8359470.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!