作者:Shirley韻 | 来源:互联网 | 2023-06-25 19:21
由于微信小程序中只提供了template,而template仅仅是视图模板,我们其实想要的组件是包含视图(wxml和wxss)和逻辑(js)的。网上有第三方框架可以组件化,但是看了
由于微信小程序中只提供了template,而template仅仅是视图模板,我们其实想要的组件是包含视图(wxml和wxss)和逻辑(js)的。网上有第三方框架可以组件化,但是看了看,好复杂。而且结合到我们项目中,由于有1M的限制,实在无法过多使用第三方框架了。所以,有了下文。。。如果哪位大神有更好的方案,欢迎交流。
其实原理很简单,就是合并。做法分三步:
看看效果:
在子组件的input框中输入内容,父容器中显示input的内容,父容器中点击清空按钮后子组件input内容清空。
运行截图
详细说明
组件部分
1.js部分把data及方法export出去供调用侧使用。
module.exports = {
data: {
childInputVal: ''
},
inputChange: function(event) {
let inputVal = event.detail.value;
this.setData({
childCompVal: inputVal,
childInputVal: inputVal
});
}
}
2.wxml部分。
子组件
value="{{childInputVal}}"
placeholder="输入内容后自动更新父容器文本内容"
bindinput="inputChange" />
3.wxss部分
.component-container{
width: 90%;
height: 30%;
border: 1px solid #cdcdcd;
border-radius: 15px;
padding: 5px;
margin-top: 70px;
}
.desc{
margin-top: 10px;
text-align: center;
}
input{
width: 100%;
margin-top: 20px;
}
父容器部分
1.容器中wxml部分
在wxml中include上面的wxml
父容器
{{childCompVal}}
2.容器中wxss部分
在wxss中import上面的wxss文件
.button-container {
margin-top: 10px;
width: 90%;
}
.value-container {
margin-top: 30px;
width: 90%;
padding: 5px;
border: 1px solid #cdcdcd;
border-radius: 15px;
color: #333;
}
/** 引入子组件样式 **/
@import "../../components/myComponent/index.wxss"
3.容器中js部分
1.引入子组件的js文件
var myCompOnent= require('../../components/myComponent/index');
2.把原来Page({…})中的代码移出
// 原来
Page({
data:{
data1: 'data1',
data2: 'data2'
},
func1: function() {...}
});
// 改成
var pageObj = {
data:{
data1: 'data1',
data2: 'data2'
},
func1: function() {...}
};
Page(pageObj);
3.在调用Page(pageObj)之前,把引入的共通内容合并到进pageObj中
for (let compKey in compObj) {
if (compKey == 'data') {
// 合并页面中的data
let data = compObj[compKey];
for(let dataKey in data) {
pageObj.data[dataKey] = data[dataKey];
}
} else {
// 合并页面中的方法
pageObj[compKey] = compObj[compKey];
}
}
Page(pageObj);
示例代码
github地址:https://github.com/yinhaijiao/XcxComponentsDemo