收藏
回答

大家把【自定义组件】遇到的问题和解决方法都统一在这里讨论吧。

自定义组件才出来没多久,感觉解决了很多的问题,不过刚开始用不免遇到边边角角的问题,希望大家都可以在这个帖子统一记录问题和解决方法,方便快速查找问题。


楼主先来遇到的问题和解决方法:


  1. 在引用组件时在页面的 json 文件中进行配置。

{
  "usingComponents": {
    "component-tag-name": "path/to/the/custom/component"
  }
}


        这里的组件名称是随便取得名字;

        后面的组件路径使用相对路径,不需要加后缀名称。如: ../test/test


2. 按照官网自定义组件写法但没有成功显示??


    首先检查下开发工具使用的基础库版本。官网说明要 1.6.3 才能使用自定义组件,在更新1.6.3 版本时间节点之前创建的项目默认基础库是不会自动设置为 1.6.3 的,这个要注意一下。


    设置方式:开发工具右上角 > 详情  >  项目设置 > 基础库版本。


回答关注问题邀请回答
收藏

23 个回答

  • Amethyst
    Amethyst
    2017-11-07

    难道不是onPageInputChange才是事件名称吗?如果页面有多个bindinput怎么触发呢?我蒙了

    2017-11-07
    有用
    回复
  • 大橙子
    大橙子
    2017-11-07
    1. 我这里是页面和组件的交互,和你所说的父组件和子组件的交互实质上是一样的;

    2. 我测试发现事件名称是需要一样的,否则没响应,如果你发现不一样也可以传值,欢迎交流;

    3. 请注意看 index.wxml 页面中事件为 bindinput="xxx",bind 只是绑定事件的前缀,真正的事件名称是 input,这里是有的。


    2017-11-07
    有用
    回复
  • 大橙子
    大橙子
    2017-11-07

    上面说的不准确,这里补充一下:

    this.triggleEvent(eventName, options, other)

    - eventName 顾名思义,事件名称

    - options 是个对象,处理机制应该是将这个对象复制给页面事件方法中的参数 e.detail,所以这个地方直接传个对象也是可以的,比如这样,这个地方的方法 minus 就没有 e 参数,所有在 triggerEvent 中第二个参数直接传个对象,在页面中使用 e.detail.value 也是可以接收到值的。

        // 组件 price.js

       minus: function () {

          // 减值大于最小值,才允许减法运算
          var num = this.data.num - 1;
          if (num >= this.data.min) {
            this.setData({
              num: num
            })
            this.triggerEvent('input', { value: num })
          }
        },

    - 第三个参数 other 是处理事件冒泡的,暂时好像没发现有啥影响。

    2017-11-07
    有用
    回复
  • Amethyst
    Amethyst
    2017-11-07

    你这个triggerEvent的事件名都没有在父组件出现啊?。。。

    2017-11-07
    有用
    回复
  • Amethyst
    Amethyst
    2017-11-07

    事件名称也要相同?

    2017-11-07
    有用
    回复
  • 大橙子
    大橙子
    2017-11-07

    我测试了下成功了,demo 如下:


    1. 组件 price.wxml

    <input class="inputStyle" value="{{num}}" type="number" bindinput='onCompInputChange'/>


    2. 组件 price.js

    Component({

        methods: {

            onCompInputChange: function (e) {

                console.log('comp input method')

                console.log(e.detail.value)

                this.triggerEvent('input', e.detail) // 只会触发 pageEventListener2

            }

        }

    })


    3. 页面 index.wxml

    <price  num="{{2}}" min="{{1}}" bindinput="onPageInputChange"/>


    4. 页面 index.js

    Page({

        onPageInputChange: function (e) {

            console.log('page input method')

            console.log(e.detail.value)

        }

    })


    总结:

    a. 组件和页面的 .wxml 事件名称要相同,比如我这里都是 bindinput,试了下自定义事件没有成功;

    b. 页面 index.js 中事件 onPageInputChange 的参数 e 来源于组件 price.js 中 this.triggleEvent 的第二个参数,而且这里必须要是 e.detail,写 e 的话传过去的值只能是 undefined。


    2017-11-07
    有用
    回复
  • Amethyst
    Amethyst
    2017-11-06

    子组件向父组件怎么传的数据??

    2017-11-06
    有用
    回复
  • Amethyst
    Amethyst
    2017-11-06

    怎么还是不行






    就是按照这个步骤来的

    2017-11-06
    有用
    回复
  • 大橙子
    大橙子
    2017-11-06

    哈哈,好吧,我看的不够仔细。

    2017-11-06
    有用
    回复
  • Amethyst
    Amethyst
    2017-11-06

    不能包含数字是文档说的  名字这些都是只能用小写字母和下划线的 我用数字也错

    2017-11-06
    有用
    回复

正在加载...

登录 后发表内容