<div id="app">
<h3>{{title}}</h3>
</div>
<script src="./reactive.js"></script>
<script>
// 基本结构
const Vue = {
createApp(options) {
const renderer = Vue.createRenderer({
querySelector(selector) {
return document.querySelector(selector)
},
insert(child, parent, anchor) {
parent.insertBefore(child, anchor || null)
}
})
return renderer.createApp(options)
},
createRenderer({ querySelector, insert }) { // 平台特有操作
// 获得渲染器
return {
render() { },
hydrate() { },
createApp(options) {
// 返回App实例
return {
mount(selector) {
// 宿主
const parent = querySelector(selector)
// 获取渲染函数,编译结果
if (!options.render) {
options.render = this.compile(parent.innerHTML)
}
if (options.setup) {
this.setupState = options.setup()
}
this.data = options.data()
this.proxy = new Proxy(this, {
// 代理目标和访问的key
// target指的是app
get(target, key) {
if (key in target.setupState) {
return target.setupState[key]
} else {
return target.data[key]
}
},
set(target, key, val) {
if (key in target.setupState) {
target.setupState[key] = val
} else {
target.data[key] = val
}
}
})
// 渲染dom,追加到宿主元素
this.update = effect(() => {
const el = options.render.call(this.proxy)
parent.innerHTML = ''
insert(el, parent)
})
// this.update()// init
},
compile(template) {
// 返回render
return function render() {
// 描述视图
const h3 = document.createElement('h3')
h3.textContent = this.title
return h3
}
}
}
}
}
}
}
</script>
<script>
const { createApp } = Vue
// new Vue
// Vue.component
// 函数式: 类型支持ts,摇树优化,打包体积减小
// 消灭静态方法,编程实例方法
// 避免全局污染,实例之间相互独立
// 扩展性, 自定义渲染器
// const app2 = createApp({})
// app.config.globalProperties.xxx
const app = createApp({
// 统一api,一致性
data() {
return {
title: 'hello,vue3!'
}
},
setup() {
const state = reactive({
title: 'vue3, hello!'
})
setTimeout(() => {
state.title = 'hello, vue3!'
}, 2000);
return state
}
})
// api简化、一致性
app.mount('#app')
</script>
vue3的实现
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 项目地址 GitHub[https://github.com/xfy520/vue3-seamless-scrol...
- 页面显示 写在前面 改代码使用slot,接口返回值必须为title,key,children,不能使用API 这个...