目录
一、父子组件传值
3种方法:
- 组件属性传值;(只能用于父组件传递给子组件,不能同步-----传简单数据)
- 通过绑定事件的方式传值;
- 通过子组件实例对象的方式。
1.组件属性传值:父传子
父子组件不能同步数据,只能传递简单数据-----几种基本类型:
<!--pages/home/home.wxml-->
<text>pages/home/home.wxml</text>
<view>父组件的num:{{num}}</view>
<view>------------------------</view>
<my_test01 num="{{num}}"></my_test01>
// pages/home/home.js
Page({
/**
* 页面的初始数据
*/
data: {
num: 522731
},
})
<!--components/test01/test01.wxml-->
<view>子组件接收到的num:{{num}}</view>
<button bindtap="changeNum">点击修改</button>
// components/test01/test01.js
Component({
/**
* 组件的属性列表
*/
properties: {
num:Number
},
/**
* 组件的方法列表
*/
methods: {
changeNum(){
this.setData({
num:this.properties.num + 1
})
}
}
})
2.通过绑定事件的方式传值:子组件调用父组件的函数并传参
在父组件中定义事件函数传递子组件修改的数值, bind:sync="syncNum"中bind表示绑定事件,sync为该绑定事件的一个属性(可自定义),syncNum为绑定事件的名称。
<!--pages/home/home.wxml-->
<text>pages/home/home.wxml</text>
<view>父组件的num:{{num}}</view>
<view>------------------------</view>
<my_test01 num="{{num}}" bind:sync="syncNum"></my_test01>
<!-- sync可自定义名字,表示绑定事件的属性 -->
在子组件的事件函数changeNum中定义this.triggerEvent()函数,即当此时调用父组件中的事件函数syncNum,并将子组件中修改后的新值赋给父组件事件函数的某个属性(通过实参传递实现)。
在triggerEvent()函数中:第一个参数需与绑定事件时携带的属性同名,第二个参数是函数调用时的实参。
// components/test01/test01.js
Component({
/**
* 组件的属性列表
*/
properties: {
num:Number
},
/**
* 组件的方法列表
*/
methods: {
changeNum(){
this.setData({
num:this.properties.num + 1,
});
// 调用父组件绑定在子组件的事件函数
this.triggerEvent("sync", {newNum:this.properties.num}); //第一个参数需与绑定事件时携带的属性同名,第二个参数是函数调用时的实参
}
}
})
在调用父组件的事件函数后,变化后的新值通过事件对象e获取,反传回来的新值存在于事件对象的detail中。然后获取新值赋给父组件中的num最后实现父子组件中的数据同步。
// pages/home/home.js
Page({
/**
* 页面的初始数据
*/
data: {
num: 522731
},
// 在父组件中定义事件函数,用于同步产生变化的数据
// 该函数通过事件对象e接收反传回来的新值
syncNum(e){
console.log(e) // 反传回来的新值存在于事件对象的detail中
this.setData({
num: e.detail.newNum
})
},
})
3.获取子组件的实例对象,访问子组件内的任意数据、方法
在子组件标签中定义id或者类标签,当点击按钮时通过事件函数获取子组件的实例对象。
<!--pages/home/home.wxml-->
<text>pages/home/home.wxml</text>
<view>父组件的num:{{num}}</view>
<view>------------------------</view>
<my_test01 num="{{num}}" id="childTest"></my_test01>
<button bindtap="getChild">获取子组件的实例对象</button>
通过selectComponent() 获取组件的实例对象,括号内的字段需与之前定义的id或类标签定义的名字相同,同时加上前缀 "#“或” . "。
通过打印子组件的实例对象可以看到子组件的num值以及定义的事件函数。也即可以获得。
// pages/home/home.js
Page({
getChild(){
// 获取子组件的实例对象
const child = this.selectComponent("#childTest");
console.log(child);
child.setData({
num: child.properties.num + 1
})
},
})
修改父组件中的num值,实现数据同步:
// pages/home/home.js
Page({
/**
* 页面的初始数据
*/
data: {
num: 522731
},
getChild(){
// 获取子组件的实例对象
const child = this.selectComponent("#childTest");
console.log(child);
child.setData({
num: child.properties.num + 1,
}),
// 修改父组件中的num值,实现数据同步
this.setData({
num: child.properties.num
})
},
})
二、behavior共享-代码块的共享
1.behavior的使用
新建一个behavior文件夹,用来存放可以共享的代码块,新建my-behavior的js文件。在该文件调用Behavior方法,该方法接收一个对象,该对象的组成与组件components相同。并通过module.exports导出代码块。不要将不公开的内容放进去。
// 在组件中共享的代码块:数据、属性、方法
module.exports = Behavior({
data:{
},
properties:{
},
methods:{
}
})
在组件中导入并使用behavior:
// components/test01/test01.js
// 导入behavior
const myBehavior = require("../../behavior/my-behavior");
Component({
// 将behavior实例挂载到组件的behaviors节点上
behaviors:[myBehavior],
/**
* 组件的初始数据
*/
data: {
userName: "Kobe"
},
})
示例:当behavior和组件components中都存在相同属性userName时,组件自身的属性会覆盖behavior的同名属性。
更多覆盖规则见网址:https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/behaviors.html
<!--components/test01/test01.wxml-->
<view>{{userName}}</view>
// components/test01/test01.js
// 导入behavior
const myBehavior = require("../../behavior/my-behavior");
Component({
// 将behavior实例挂载到组件的behaviors节点上
behaviors:[myBehavior],
data: {
userName: "Kobe"
},
})
// behavior/my-behavior.js
// 在组件中共享的代码块:数据、属性、方法
module.exports = Behavior({
data:{
userName:"LeBron"
},
})
三、Vant Weapp的使用
1.安装及配置
- 进入微信开发者工具使用的文件目录下;
- 初始化 npm init -y (会生成package.json文件)
- 安装 npm i @vant/weapp -S --production (快速上手 - Vant Weapp (oschina.io))可指定版本:npm i @vant/weapp@+版本号 -S --production ;
- 删除app.json中的版本号:“style”: “v2”;
- 修改 project.config.json:开发者工具创建的项目,miniprogramRoot 默认为 miniprogram,package.json 在其外部,npm 构建无法正常工作。需要手动在 project.config.json 内添加如下配置,使开发者工具可以正确索引到 npm 依赖的位置;
注意: 由于目前新版开发者工具创建的小程序目录文件结构问题,npm构建的文件目录为miniprogram_npm,并且开发工具会默认在当前目录下创建miniprogram_npm的文件名,所以新版本的miniprogramNpmDistDir配置为’./'即可。
{
...
"setting": {
...
"packNpmManually": true,
"packNpmRelationList": [
{
"packageJsonPath": "./package.json",
"miniprogramNpmDistDir": "./miniprogram/"
}
]
}
}
- 构建npm包:打开微信开发者工具,点击 工具 -> 构建 npm,并勾选 使用 npm 模块 选项,构建完成后,即可引入组件。设置使用npm模块。
2.使用方法
可以在全局或页面引用组件,例如在全局引入按钮:
// app.json
{
"usingComponents": {
"van-button": "@vant/weapp/button/index"
}
}
<!--pages/home/home.wxml-->
<van-button>默认按钮</van-button>
<van-button type="primary">主要按钮</van-button>
<van-button type="info">信息按钮</van-button>
<van-button type="warning">警告按钮</van-button>
<van-button type="danger">危险按钮</van-button>
3.定制主题
定制主题官方文档: https://vant-contrib.oschina.io/vant-weapp/#/theme
小程序基于 Shadow DOM 来实现自定义组件,所以 Vant Weapp 使用与之配套的 CSS 变量( https://developer.mozilla.org/zh-CN/docs/Web/CSS/Using_CSS_custom_properties) 来实现定制主题。链接中的内容可以帮助你对这两个概念有基本的认识,避免许多不必要的困扰。
CSS 变量 的兼容性要求可以在链接: https://caniuse.com/css-variables 查看。对于不支持 CSS 变量 的设备,定制主题将不会生效,不过不必担心,默认样式仍会生效。
样式变量
定制使用的 CSS 变量 与 Less 变量 同名,下面是一些基本的样式变量,所有可用的颜色变量请参考配置文件: https://github.com/youzan/vant-weapp/blob/dev/packages/common/style/var.less
// Component Colors
@text-color: #323233;
@border-color: #ebedf0;
@active-color: #f2f3f5;
@background-color: #f8f8f8;
@background-color-light: #fafafa;
/* 在页面根节点page中定义修改组件颜色的变量 */
page{
--button-info-background-color: #ff0;
--button-info-background-color: #f00;
}