原生JS实现vue中data值的修改与渲染
前言
砖搬多了就得想想怎么造砖,Vue使用多了,也得想想Vue是咋实现,Vue用着确实舒服,仔细了解一下,背后做的操作也太多了吧,但是再多的操作也是一个一个积累起来的吧!
先记录一下怎么实现data中值的渲染与修改
class Wvue extends EventTarget {constructor(option) {super()console.log(option)this.$options = optionthis.compile()this.observe(this.$options.data)}observe(data) {let keys = Object.keys(data)console.log(keys)keys.forEach(key => {this.defineData(data, key, data[key])})}// 数据劫持函数defineData(data, key, value) {let that = thisObject.defineProperty(data, key, {configurable: true,enumerable: true,get() { //获取data中数据时触发// console.log('get数据了')return value},set(newValue) { //给data中数据赋值时执行console.log('哈哈哈,我设置数据了')let event = new CustomEvent(key, { //向compileNode函数中传递要改变的值detail: newValue})console.log(this)// this.dispatchEvent(event)//注意这里的this指向vm.$options.datathat.dispatchEvent(event)value = newValue}})}compile() {let el = document.querySelector(this.$options.el)this.compileNode(el)}compileNode(el) {let childNodes = el.childNodeschildNodes.forEach(node => {if (node.nodeType === 1) {//标签if (node.childNodes.length > 0) { //如果标签里还有嵌套标签或文本就继续调用this.compileNode(node)}} else if (node.nodeType === 3) {//文本节点console.log(node)let reg = /\{\{\s*(\S+)\s*\}\}/glet textContent = node.textContentconsole.log(textContent)if (reg.test(textContent)) {console.log('存在花括号')let $1 = RegExp.$1node.textContent = node.textContent.replace(reg, this.$options.data[$1])this.addEventListener($1, e => {console.log(e.detail)//这里是第二次渲染,要把新值赋值给data中的旧值let oldValue = this.$options.data[$1]// console.log(oldValue) //打印出data中的旧值let reg = new RegExp(oldValue)node.textContent = node.textContent.replace(reg, e.detail)//重新渲染视图})}}})}
}
<div id="app">{{message}}<div class="content">{{htmlData}}</div></div><script src="./mvvm.js"></script><script>let vm = new Wvue({el: '#app',data: {message: '加油',htmlData: 'hello'}})setTimeout(() => {vm.$options.data.message = '我要修改数据了'})</script>
原生JS实现vue中data值的修改与渲染相关推荐
- [vue] vue中data的属性可以和methods中的方法同名吗?为什么
[vue] vue中data的属性可以和methods中的方法同名吗?为什么 源码 中的 initData() 方法 if (methods && hasOwn(methods, ke ...
- vue中data数据之间如何赋值
vue中data数据之间如何赋值 前言 实现方式 前言 最近我妹突然问我vue的data之间需要进行赋值,这是什么奇葩需求,干嘛不直接自己定义好就好了啊,既然有这种场景,那么我们就需要去解决这种场景. ...
- js取iframe 上级页面_原生js获取iframe中dom元素--父子页面相互获取对方dom元素的方法...
用原生js在父页面获取iframe子页面的元素,以及在子页面获取父页面元素,这是平时经常会用到的方法,这里写一个例子来总结下: 1.父页面(demo.html),在父页面修改子页面div的背景色为灰色 ...
- Moment.js在Vue中使用
Moment.js在Vue中使用 1. 安装依赖包 npm install moment --save 2. main.js中引入 import moment from 'moment' Vue.pr ...
- js 或者vue中for循环去掉最后一个逗号
js 或者vue中for循环去掉最后一个逗号 一个感觉很简单的问题,刚开始我没有思路,现在也没有更好的思路 问题描述: 后端返回的一个数组,前端这边需要循环把名字展示,要求在展示时,每个名字后用** ...
- Vue 中data 和 data() 区别
Vue 中data 和 data() {return {};}区别 一般简单Vue实例(常见教程视频中) new Vue({el: "#id",data: {message: &q ...
- js删除对象中所有值为null和undefined的属性
和后台对接的时候的需求,他们不希望我传入那些值为null和undefined的属性,那我就先删除了吧. var obj = {aaa: 1,b: null,ccc: 'js删除对象中所有值为null的 ...
- vue中怎么点击修改文字_vue中如何实时修改输入的值
vue中如何实时修改输入的值 经常看到需要对用户输入的值进行实时修改,有时是需要修改为指定的展示内容,有时候是用来校验,禁止用户输入非法数据,总之是一个常见的需求吧,只是自己一直没有特意去关注.思来想 ...
- 原生js 或vue实现60分钟倒计时案例
使用场景类似于 订单倒计时,或答题倒计时,代码如下 在Vue中封装了如下的方法 data () {return {countdownTxt:'',//要显示的倒计时文案};}, // 定义一个方法 方 ...
最新文章
- 表格转化为Latex代码
- WIN32 使用事件实现高效生产者消费者模型
- 被丧心病狂的验证码虐过,来感受一下交互体验很好的十款吧
- wp7设置浏览器主页
- JAVA中各种简写全称整理
- C++类的构造函数、析构函数与赋值函数
- 编译型语言和解释性语言,c++和python
- 声音鉴定-趣味测试-源码
- 小米手机便签怎么批量导出到另一个手机
- 计算机日期型函数公式,excel函数公式应用:日期格式转换公式大全-excel技巧-电脑技巧收藏家...
- 用svn上的文件,覆盖本地文件
- mpu6050 z轴校准_MPU6050校准
- 速成KeePass全局自动填表登录QQ与迅雷(包括中文输入法状态时用中文用户名一键登录)...
- STM32配合火焰传感器的火灾报警
- 微软project服务器搭建,Project Server 2013 安装和部署概述
- UEBA案例分析系列之检测失陷凭证
- 【python与数据分析】CH3 python序列结构补充——字符串
- NLP实战一 利用OpenAI Codex实现中文转python代码
- SWPU学分绩点计算器女生版
- 你还在担心你的 IP 被封吗?
热门文章
- 免费皮肤控件的使用方法及效果测试——USkin v2.2
- 免费的dns解析服务 nio.io sslip.io,避免修改hosts文件
- 零基础Qt笔记<传智教育>Qt版本:2022 5.15
- 太原理工大学微型计算机接口技术,微机原理与接口技术课程设计 太原理工大学.doc...
- PDF怎么扫描转换成电子版?这两种方法可以实现转换
- 获取手机通讯录 (含SIM卡中的联系人)
- IPv6地址分类细则
- 在python程序中调用另一个py文件
- java获取文件夹下的文件或文件夹
- Dev-C++5.11游戏创作之迷你世界2(进阶版)