自定义组件才出来没多久,感觉解决了很多的问题,不过刚开始用不免遇到边边角角的问题,希望大家都可以在这个帖子统一记录问题和解决方法,方便快速查找问题。
楼主先来遇到的问题和解决方法:
在引用组件时在页面的 json 文件中进行配置。
{ "usingComponents": { "component-tag-name": "path/to/the/custom/component" } } |
这里的组件名称是随便取得名字;
后面的组件路径使用相对路径,不需要加后缀名称。如: ../test/test
2. 按照官网自定义组件写法但没有成功显示??
首先检查下开发工具使用的基础库版本。官网说明要 1.6.3 才能使用自定义组件,在更新1.6.3 版本时间节点之前创建的项目默认基础库是不会自动设置为 1.6.3 的,这个要注意一下。
设置方式:开发工具右上角 > 详情 > 项目设置 > 基础库版本。
难道不是onPageInputChange才是事件名称吗?如果页面有多个bindinput怎么触发呢?我蒙了
我这里是页面和组件的交互,和你所说的父组件和子组件的交互实质上是一样的;
我测试发现事件名称是需要一样的,否则没响应,如果你发现不一样也可以传值,欢迎交流;
请注意看 index.wxml 页面中事件为 bindinput="xxx",bind 只是绑定事件的前缀,真正的事件名称是 input,这里是有的。
上面说的不准确,这里补充一下:
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 是处理事件冒泡的,暂时好像没发现有啥影响。
你这个triggerEvent的事件名都没有在父组件出现啊?。。。
事件名称也要相同?
我测试了下成功了,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。
子组件向父组件怎么传的数据??
怎么还是不行
就是按照这个步骤来的
哈哈,好吧,我看的不够仔细。
不能包含数字是文档说的 名字这些都是只能用小写字母和下划线的 我用数字也错