vue2的$refs在vue3组合式API中的替代方

该博客介绍了如何在Vue中创建一个名为QtChart的图表组件,利用Chart.js库进行数据可视化。组件接受type、data、options和height等属性,支持动态更新数据和配置。同时,组件还提供了refKey来绑定实例,便于在父组件中进行交互。文章强调了ref的正确使用,指出当html中的ref与setup返回的引用名称不匹配时,会导致程序错误。
摘要由CSDN通过智能技术生成

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

<template>

    <canvas ref="refChart" :height="setHeight"></canvas>

</template>

<script>

import { defineComponent, onMounted, ref, inject, watch } from "vue";

import Chart from "chart.js";

import { deepCopy } from "@/helper/index";

export default defineComponent({

    name: "QtChart",

    props: {

        type: {

            type: String,

            required: true,

            default: "line",

        },

        data: {

            type: Object,

            required: true,

            default: () => ({}),

        },

        options: {

            type: Object,

            default: () => ({}),

        },

        height: {

            type: Number,

            default: 0,

        },

        refKey: {

            type: String,

            default: null,

        },

    },

    setup(props) {

        const refChart = ref();

        // 初始化方法

        const init = () => {

            const canvasChart = refChart.value?.getContext("2d");

            const chartHelper = new Chart(canvasChart, {

                type: props.type,

                data: deepCopy(props.data),

                options: props.options,

            });

            watch(props, () => {

                chartHelper.data = deepCopy(props.data);

                chartHelper.options = props.options;

                chartHelper.update();

            });

            // 附加一个实例给refChart

            refChart.value.instance = chartHelper;

        };

        // 设置高度

        const setHeight = () => {

            return {

                height: props.height,

            };

        };

        // 绑定一个实例,使用inject注入

        const bindInstance = () => {

            if (props.refKey) {

                const bind = inject(`bind[${props.refKey}]`);

                if (bind) {

                    bind(refChart.value);

                }

            }

        };

        onMounted(() => {

            bindInstance();

            init();

        });

        return {

            refChart,

            setHeight,

        };

    },

});

</script>

这段代码完整的实现了一个图表组件Chart,其中自定义了属性props,通过把参数传递给setup方法来使用其属性值。html中定义一个ref="refChart"来作为图表的dom对象,在setup方法中通过方法ref方法来定义响应式可变对象,并在setup函数结尾作为返回值。

1

const refChart = ref();

需要注意的是,返回值的属性名必须和html中的ref值一致。

下面代码是可以正常执行的。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<template>

    <canvas ref="refChart" :height="setHeight"></canvas>

</template>

<script>

import { defineComponent, onMounted, ref, inject, watch } from "vue";

import Chart from "chart.js";

import { deepCopy } from "@/helper/index";

export default defineComponent({

    name: "QtChart",

    props: {

        // ...

    },

    setup(props) {

        const refChartBox = ref();

        // ...

        return {

            refChart:refChartBox,

        };

    },

});

</script>

下面的情况,会出现程序错误,无法达到预期效果。应为html中定义的ref="refChart"和setup返回的refChartBox不一致。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<template>

    <canvas ref="refChart" :height="setHeight"></canvas>

</template>

<script>

import { defineComponent, onMounted, ref, inject, watch } from "vue";

import Chart from "chart.js";

import { deepCopy } from "@/helper/index";

export default defineComponent({

    name: "QtChart",

    props: {

        // ...

    },

    setup(props) {

        const refChartBox = ref();

        // ...

        return {

            refChartBox,

        };

    },

});

</script>

结论

本文只是简单的介绍ref方法的使用,正好在项目中用到,后续将继续边学边推进项目并做好笔记

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

丶乘风破浪丶

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值