【Vueの高度な知識】Vueの3つの要素(応答式+テンプレート+render関数)を詳しく述べる
33233 ワード
Vueの3要素は何ですか?
応答:
Vueでテンプレートをどのように解析しますか?
テンプレートは何ですか?
render関数?
withの使い方
render関数の実現メカニズム?
render関数とvdom?
vm._cは何ですか.render関数は何を返しますか. vdom:jsを使用してDOm構造をシミュレート snabdom:h関数とpatch関数Vueのv_c:snabdom関数に相当するh関数patch関数:初回レンダリングとデータ更新トリガ
応答:
// ?
let obj = {};
let name = 'zhangsan';
Object.defineProperties(obj, name, {get : function() {
console.log('name' , name)
}, set : function() {
console.log('name' , name)
}})
// 1. Object.defineProperty
// 2. data vm
let mv = {};
let data = {
price: 100,
name: 'zhangsan'
};
for (let key in data) {
(function (key) {
Object.defineProperty(mv, key, {
get: function () {
console.log('get val');
return data[key];
},
set: function (val) {
console.log('set val');
data[key] = val;
}
})
})(key);
}
Vueでテンプレートをどのように解析しますか?
テンプレートは何ですか?
<div id="app">
<div>
<input v-model="title">
<button v-on:click="add">submitbutton>
div>
<ul>
<li v-for="item in list">{{item}}li>
ul>
div>
// 1(*****). ………………(vue )
// 2. , v-if, v-for
// 3. html ,
// 4. html
// 5(*****). JS , :
// (1) (v-if v-for): JS ( )
// (2) HTML , JS
// (3) , JS (render )
render関数?
withの使い方
var obj = {
name: 'zhangsan',
age: 20,
getAddress(){
alert('shanghai');
}
}
// with
function fn() {
alert(obj.name);
alert(obj.age);
obj.getAddress();
}
// with( !!!)
function fn1() {
with(obj){
alert(name);
alert(age);
getAddress();
}
}
fn();
fn1();
render関数の実現メカニズム?
<div id='app'>
<p>{{price}}</p>
</div>
// with this
with(this) {
return _c( // this._c
'div',
{
attrs: {"id" : "app"} // id=app
},
[
_c('p', [_v(_s(price))]) // this._c('p', [_v(_s(price))])
]
)
}
// render
var vm = new Vue({
el: '#app',
data: {
price: 100
}
});
function render() {
with (vm) {
return _c(
'div',
{
attrs: {'id': 'app'}
},
[
_c('p', [_v(_s(price))])
]
);
}
}
function render() {
return vm._c(
'div',
{
attrs: {'id': 'app'}
},
[
// vm._v
// vm._s
// vm._c DOM
vm._c('p', [vm._v(vm._s(price))])
]
);
}
render関数とvdom?
<div id="app">
<div>
<input type="text" v-model="title">
<button @click="add">submitbutton>
div>
<div>
<ul>
<li v-for="item in list">{{item}}li>
ul>
div>
div>
with (this) {
// this vm
return _c(
'div',
{attrs: {"id": "app"}},
[
_c('div',
[
_c('input', {
directives: [{
name: "model",
rawName: "v-model",
value: (title),
expression: "title"
}],
attrs: {"type": "text"},
domProps: {"value": (title)},
on: {
"input": function ($event) {
if ($event.target.composing) return;
title = $event.target.value
}
}
}),
_v(" "),
_c('button',
{
on: {
"click": add
}
},
[_v("submit")]
)
]
),
_v(" "),
_c('div',
[
_c(
'ul',
// (li )
_l((list), function (item) {
return _c('li', [_v(_s(item))])
}), 0
)
]
)
]
)
}
// view ---> data ---> input ---> data
// data ---> view ---> defineProperty --->
vm._cは何ですか.render関数は何を返しますか.
vm._update(vnode) {
const prevNode = vm._vnode;
vm._vnode = vnode;
if (!prevNode) {
//
vm.$el = vm.__patch__(vm.$el, vnode);
}
else{
vm.$el = vm.__patch__(prevNode, vnode);
}
}
// vue ( data ,Object.defineProperty)
function updateComponent() {
vm._update(vm._render());
}