手撕Vue-实现计算属性

前言

经过上一篇的学习, 完成了将数据代理到了 Nue 的实例上方,这个我们已经撕完了。接下来要实现的是计算属性,计算属性的实现原理是通过 Object.defineProperty() 来实现的,我们先来看看计算属性的使用。

看之前先来改造一下我们的代码基础模板,首先是 example.html 的内容如下:

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Vue基本模板</title>
    <script src="js/nue.js"></script>
</head>
<body>
<div id="app">
    <p>{{ getName }}</p>
</div>

<script>
    let vue = new Nue({
        el: document.querySelector('#app'),
        data: {
            name: "BNTang"
        },
        computed: {
            getName() {
                return this.name + "- 666";
            }
        }
    });
</script>
</body>
</html>

导入的 Nue.js 是我们之前写的这里不在贴代码,好了,我编写了一个计算属性,用模板语法的方式进行了渲染,页面肯定是显示 undefined 的,因为我们还没有实现计算属性的功能,接下来我们就来实现计算属性的功能。

在实现之前,我们来分析一下计算属性的编写思路, 当我们在 computed 编写了一个计算属性名称,比如 getName,这个时候呢我使用的是模板 {``{}} 进行调用,那么我们去看一下模板的渲染源代码,在其中是可以拿到 getName 的,这个时候我们的 getContent 是从 Nue 中的 data 中去获取的,那我是不是可以在创建 Nue 实例时,将 computed 中的内容也放到 data 中呢?这样的话,我在 getContent 中就可以拿到了,那么我们就来实现一下吧。

将 computed 中的内容放到 data 中,我们可以在 Nue 的构造函数中进行实现,首先将 computed 的内容存储起来,然后在 data 中进行合并,代码如下:

存储 computed 的内容:

javascript 复制代码
this.$computed = options.computed;

将 computed 中的方法添加到 data 中, 只有这样将来我们在渲染的时候才能从 data 中获取到 computed 中定义的计算属性,定义一个 computed2data 方法单独来处理:

javascript 复制代码
computed2data() {
    for (let key in this.$computed) {
        Object.defineProperty(this.$data, key, {
            get: () => {
                return this.$computed[key].call(this);
            }
        });
    }
}

这里我们使用了 Object.defineProperty() 来实现,这里的 get 方法就是我们在模板中调用计算属性时,获取计算属性的值,这里的 this.$computed[key] 就是我们在 computed 中定义的方法,然后我们调用这个方法,这里的 this 是指向 Nue 的实例的,所以我们需要使用 call 来改变 this 的指向,这样我们就可以在模板中调用计算属性了。

好了,我们现在已经将计算属性的内容添加到了 $data 中,那么我们就可以在 getContent 中获取到计算属性的值了,打开浏览器,查看一下效果:

相关推荐
A小码哥3 分钟前
大模型成本怎么降,5 个动作先做前两个
java·前端·spring
PHP是世界上最好的语言16 分钟前
ComPDF预览本地正常,部署后白屏:检查资源、路径和许可
前端
kiros_wang17 分钟前
项目分包方案:模块拆分、跨模块组件与方法引用规范
前端
PedroQue9919 分钟前
unix-utils v0.2.0 发布:modal 全端统一,自绘窗口解决输入框难题
前端·uni-app
Csvn20 分钟前
网络优化
前端
代码猎人23 分钟前
前端怎么跟进生态新技术
前端
海阳皓辰网络科技有限公司24 分钟前
Vue3 冷库货位选择器:三级联动、扫码带出与批次混放校验
前端·vue.js
__sjfzllv___26 分钟前
在职前端Leader学习/转行 AI Agent -DAY81
前端
女生也可以敲代码27 分钟前
div上有红色下划线报错:JSX 元素隐式具有类型 “any“,因为不存在接口 “JSX.IntrinsicElements“。ts(7026)
前端
申君健248641827720229 分钟前
ArkTS 速成指南(写给有 TypeScript / 前端经验的开发者)
前端