使用原生實現簡單的vue

2021-09-25 12:05:49 字數 2380 閱讀 7666

html

} }

{}} -->

更新操作 js

let vm = new vue(

},computed:

},methods:

},})

//觀察者 (發布訂閱) 觀察者 被觀察者

class dep

//訂閱

addsub(watcher)

//發布

notify()

}class watcher

get()

update()

}}// vm.$watch(vm,'school.name',(newval)=>)

class observer

observer(data) }}

definereactive(obj, key, value) ,

set: (newval) => school={}

//把老的值改為新的

if (newval != value) }})

}}//基類

class compiler

//判斷是否是指令

isdirective(attrname)

//編譯元素 div ul span

compileelement(node) = attr; //獲取 name 屬性名 值 對應data的屬性

//判斷是不是指令

if (this.isdirective(name)) })}

//編譯空 text text內也可以是內容 大多都是

間隔這裡就是text

compiletext(node) } }

let content = node.textcontent;

//去除不需要的

if (/\\}/.test(content)) } }

// console.log(content, "內容");}}

//核心的編譯方法

compile(node) } v-的屬性

let childnodes = node.childnodes;//那到所有的子節點

// console.log(childnodes);

//childnodes只是個類陣列,使用[...arr]轉換為陣列

[...childnodes].foreach(child => else })}

//把節點移動到記憶體中

node2fragment(node)

return fragment;

}iselementnode(node)

}compileutil = , vm.$data);

},setvalue(vm, expr, value)

return data[current];

}, vm.$data);

},model(node, expr, vm) );

node.addeventlistener('input', (e) => )

// console.log(node, 'node', expr, "nodeexpr")

let value = this.getval(vm, expr);//返回值就是 需要的屬性值

fn(node, value);

},getcontentvalue(vm, expr) \}/g, (...args) => )

},on(node, expr, vm, eventname) )

},text(node, expr, vm) } } } => a b c

let fn = this.updater['textupdater'];

let content = expr.replace(/\\}/g, (...args) => } 都加上觀察者

new watcher(vm, args[1], () => )

return this.getval(vm, args[1]);

});//最終內容

fn(node, content);

},updater: ,

//處理文字節點的

textupdater(node, value)

}}class vue

})};

for (let key in methods) })}

//把資料獲取操作 vm上的操作都**到 vm.$data

this.proxyvm(this.$data);

console.log(this.$data);

new compiler(this.$el, this);}}

proxyvm(data) ,

set(newval) })}

}}

原生JS實現簡單的拖放

最近學到了js中的事件,感覺和windows的事件佇列和處理函式很相似哈。需要監聽事件然後要有處理事件的函式。然後做了乙個小練習,元素的拖放。廢話不說了,上效果。實現子元素任意框拖放。首先在布局上,三個大盒子中的元素都是絕對定位於他們的父元素,給三個大盒子相對定位。上html和css cnt 1sp...

使用vue實現簡單的品牌管理

引入bootstrap rel stylesheet href js bootstrap.min.css 搭建簡單頁面搭建出品牌的新增輸入框以及搜尋框和展示列表 class panel panel primary class panel heading class panel title 新增品牌h...

Ajax簡單原生使用原理

let xhr 由於存在相容問題,所以需要判斷是dom瀏覽器還是ie瀏覽器 第乙個引數 是get還是post請求,第二個引數,伺服器需要攔截的路由,第三個引數,ajax是否非同步,true為非同步,false為同步xhr.send null get請求 xhr.send options post請求...