class11:父子组件传值、behavior共享和Vant Weapp的使用

一、父子组件传值

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Laker 23

要秃啦,支持一下嘛~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值