最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Vue響應(yīng)式原理

2022-10-18 10:46 作者:對白淺淺  | 我要投稿

<!DOCTYPE html>

<html lang="en">

<head>

? ? <meta charset="UTF-8">

? ? <meta http-equiv="X-UA-Compatible" content="IE=edge">

? ? <meta name="viewport" content="width=device-width, initial-scale=1.0">

? ? <title>Document</title>

</head>

<body>

? ? <div id="app">

? ? ? ? <input type="text" v-model="message">

? ? ? ? {{message}}

? ? </div>

? ?

? ? <script>

? ? ? ? class Vue{

? ? ? ? ? ? constructor(options){

? ? ? ? ? ? ? ? // 1.保存數(shù)據(jù)

? ? ? ? ? ? ? ? this.$options=options

? ? ? ? ? ? ? ? this.$data=options.data

? ? ? ? ? ? ? ? this.$el=options.el


? ? ? ? ? ? ? ? // 2.將data添加到響應(yīng)式系統(tǒng)中

? ? ? ? ? ? ? ? new Observer(this.$data)


? ? ? ? ? ? ? ? // 3.代理this.$data的數(shù)據(jù)

? ? ? ? ? ? ? ? Object.keys(this.$data).forEach(key=>{

? ? ? ? ? ? ? ? ? ? this._proxy(key)

? ? ? ? ? ? ? ? })


? ? ? ? ? ? ? ? // 4.處理el

? ? ? ? ? ? ? ? new Compiler(this.$el,this)

? ? ? ? ? ? }

? ? ? ? ? ?

? ? ? ? ? ? _proxy(key){

? ? ? ? ? ? ? ? ? ? Object.defineProperty(this,key,{

? ? ? ? ? ? ? ? ? ? ? ? configurable:true,

? ? ? ? ? ? ? ? ? ? ? ? enumerable:true,

? ? ? ? ? ? ? ? ? ? ? ? set(newValue){

? ? ? ? ? ? ? ? ? ? ? ? ? ? this.$data[key] = newValue

? ? ? ? ? ? ? ? ? ? ? ? },

? ? ? ? ? ? ? ? ? ? ? ? get(){

? ? ? ? ? ? ? ? ? ? ? ? ? ? return this.$data[key]

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? })

? ? ? ? ? ? ? ? }

? ? ? ? }


? ? ? ? class Observer{

? ? ? ? ? ? constructor(data){

? ? ? ? ? ? ? ? this.data=data

? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? Object.keys(data).forEach(key=>{

? ? ? ? ? ? ? ? ? ? this.defineReactive(this.data,key,data[key])

? ? ? ? ? ? ? ? })

? ? ? ? ? ? }


? ? ? ? ? ? ? ? defineReactive(data,key,val){

? ? ? ? ? ? ? ? ? ? // 一個屬性就是一個Dep對象

? ? ? ? ? ? ? ? ? ? const dep =new Dep()

? ? ? ? ? ? ? ? ? ? Object.defineProperty(data,key,{

? ? ? ? ? ? ? ? ? ? ? ? configurable:true,

? ? ? ? ? ? ? ? ? ? ? ? enumerable:true,

? ? ? ? ? ? ? ? ? ? ? ? set(newValue){

? ? ? ? ? ? ? ? ? ? ? ? ? ? if(newValue==val){

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return

? ? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? ? ? val = newValue

? ? ? ? ? ? ? ? ? ? ? ? ? ? dep.notify()

? ? ? ? ? ? ? ? ? ? ? ? },

? ? ? ? ? ? ? ? ? ? ? ? get(){

? ? ? ? ? ? ? ? ? ? ? ? ? ? if(Dep.target){

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? dep.addSub(Dep.target)

? ? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? ? ? return val

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? })

? ? ? ? ? ? ? ? }

? ? ? ? }

? ? ? ?

? ? ? ? class Dep{

? ? ? ? ? ? constructor(){

? ? ? ? ? ? ? ? this.subs=[]

? ? ? ? ? ? }


? ? ? ? ? ? addSub(sub){

? ? ? ? ? ? ? ? this.subs.push(sub)

? ? ? ? ? ? }


? ? ? ? ? ? notify(){

? ? ? ? ? ? ? ? this.subs.forEach(sub=>{

? ? ? ? ? ? ? ? ? ? sub.upDate()

? ? ? ? ? ? ? ? })

? ? ? ? ? ? }

? ? ? ? }


? ? ? ? class Watcher{

? ? ? ? ? ? constructor(node,name,vm){

? ? ? ? ? ? ? ? this.node = node

? ? ? ? ? ? ? ? this.name = name

? ? ? ? ? ? ? ? this.vm = vm

? ? ? ? ? ? ? ? Dep.target=this

? ? ? ? ? ? ? ? this.upDate()

? ? ? ? ? ? ? ? Dep.target=null

? ? ? ? ? ? }

? ? ? ? ? ?

? ? ? ? ? ? upDate(){

? ? ? ? ? ? ? ? this.node.nodeValue = this.vm[this.name]

? ? ? ? ? ? }

? ? ? ? }


? ? ? ? const reg = /\{\{(.*)\}\}/


? ? ? ? class Compiler{

? ? ? ? ? ? constructor(el,vm){

? ? ? ? ? ? ? ? this.el=document.querySelector(el)

? ? ? ? ? ? ? ? this.vm=vm

? ? ? ? ? ? ? ? console.log(vm,"這是vm")

? ? ? ? ? ? ? ? this.frag=this._createFragment() ?//創(chuàng)建代碼片段,讓片段和頁面的代碼形成映射關(guān)系

? ? ? ? ? ? ? ? this.el.appendChild(this.frag)

? ? ? ? ? ? }


? ? ? ? ? ? _createFragment(){

? ? ? ? ? ? ? ? const frag =document.createDocumentFragment() ?//后面要添加到el中

? ? ? ? ? ? ? ? let child;

? ? ? ? ? ? ? ? while(child=this.el.firstChild){ ? //每次遍歷后會移除

? ? ? ? ? ? ? ? ? ? this._compile(child)

? ? ? ? ? ? ? ? ? ? frag.appendChild(child)

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? return frag

? ? ? ? ? ? }


? ? ? ? ? ? _compile(node){

? ? ? ? ? ? ? ? if(node.nodeType===1){ ? //nodeType===1 表示是標(biāo)簽節(jié)點

? ? ? ? ? ? ? ? ? ? const attrs = node.attributes

? ? ? ? ? ? ? ? ? ? if(attrs.hasOwnProperty('v-model')){

? ? ? ? ? ? ? ? ? ? ? ? const name = attrs['v-model'].nodeValue

? ? ? ? ? ? ? ? ? ? ? ? console.log(node,"這是node")

? ? ? ? ? ? ? ? ? ? ? ? node.value=this.vm[name]

? ? ? ? ? ? ? ? ? ? ? ? node.addEventListener('input',e=>{

? ? ? ? ? ? ? ? ? ? ? ? ? ? this.vm[name]=e.target.value

? ? ? ? ? ? ? ? ? ? ? ? })

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? if(node.nodeType===3){ ? ?//nodeType===2表示是文本節(jié)點

? ? ? ? ? ? ? ? ? ? console.log(reg.test(node.nodeValue))

? ? ? ? ? ? ? ? ? ? if(reg.test(node.nodeValue)){

? ? ? ? ? ? ? ? ? ? ? ? const name = RegExp.$1.trim() ?//$1 拿到正則中第一個分組 ?“()” 中的東西 ?即為變量名 此代碼中的message

? ? ? ? ? ? ? ? ? ? ? ? console.log(name);

? ? ? ? ? ? ? ? ? ? ? ? new Watcher(node,name,this.vm)

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? }

? ? </script>

? ? <script>

? ? const app = new Vue({

? ? ? ? el:"#app",

? ? ? ? data:{

? ? ? ? ? ? message:"我是一條message"

? ? ? ? }

? ? })


? ? </script>

</body>

</html>


Vue響應(yīng)式原理的評論 (共 條)

分享到微博請遵守國家法律
巩留县| 扎赉特旗| 和硕县| 灌阳县| 西乡县| 博湖县| 车致| 叶城县| 兴和县| 达拉特旗| 环江| 花莲县| 宝鸡市| 定日县| 荥经县| 高密市| 清河县| 汽车| 海丰县| 菏泽市| 丹东市| 探索| 珲春市| 瑞安市| 连城县| 长葛市| 沈阳市| 资阳市| 孙吴县| 杭州市| 镶黄旗| 象州县| 清水河县| 分宜县| 巢湖市| 伊金霍洛旗| 博乐市| 和政县| 阿拉善左旗| 昭平县| 出国|