珠峰架构Vue3高手通关计划
虾仔客>>> 3w baikeu 点 com
## 一、手写Vue3源码
### 1. 响应式系统实现
Vue3的响应式系统是基于 `Proxy` 实现的。以下是一个简单的响应式对象示例:
```javascript
function reactive(target) {
const handler = {
get(target, key) {
// 依赖收集
console.log(`Getting ${key}`);
return target[key];
},
set(target, key, value) {
console.log(`Setting ${key} to ${value}`);
target[key] = value;
// 触发更新
return true;
}
};
return new Proxy(target, handler);
}
const state = reactive({ count: 0 });
state.count = 1; // Console: Setting count to 1
console.log(state.count); // Console: Getting count, Output: 1
```
### 2. 组件渲染过程
组件渲染使用虚拟DOM和Diff算法,下面是一个简单的渲染函数示例:
```javascript
function createElement(tag, props, ...children) {
return { tag, props, children };
}
function render(vnode) {
const el = document.createElement(vnode.tag);
for (const prop in vnode.props) {
el.setAttribute(prop, vnode.props[prop]);
}
vnode.children.forEach(child => {
if (typeof child === 'string') {
el.appendChild(document.createTextNode(child));
} else {
el.appendChild(render(child)); // 递归渲染子节点
}
});
return el;
}
// 使用示例
const vdom = createElement('div', { id: 'app' },
createElement('h1', {}, 'Hello World'),
createElement('p', {}, 'This is a simple example.')
);
document.body.appendChild(render(vdom));
```
## 二、解读Vue高频面试题
### 1. Vue的生命周期
Vue组件的生命周期分为几个阶段:
- **创建**:`beforeCreate` → `created`
- **挂载**:`beforeMount` → `mounted`
- **更新**:`beforeUpdate` → `updated`
- **销毁**:`beforeDestroy` → `destroyed`
理解每个生命周期钩子的用途至关重要,比如在`mounted`中进行数据请求。
### 2. 计算属性与方法
计算属性是基于依赖缓存的,当依赖的数据变化时,计算属性会重新计算,而方法在每次调用时都会执行。
```vue
<template>
<div>
<p>Count: {{ count }}</p>
<p>Doubled: {{ doubleCount }}</p>
<button @click="increment">Increment</button>
</div>
</template>
<script>
export default {
data() {
return {
count: 1,
};
},
computed: {
doubleCount() {
return this.count * 2; // Only recalculates when count changes
}
},
methods: {
increment() {
this.count++;
}
}
};
</script>
```
## 三、Vue3 + TS + 数据库全栈中台项目实战
### 1. 项目结构
```
my-project/
├── backend/
│ ├── models/
│ ├── routes/
│ └── app.js
└── frontend/
├── src/
│ ├── components/
│ ├── store/
│ └── App.vue
└── main.ts
```
### 2. 后端示例:Express + MongoDB
```javascript
// backend/app.js
const express = require('express');
const mongoose = require('mongoose');
const userRoutes = require('./routes/user');
const app = express();
app.use(express.json());
app.use('/api/users', userRoutes);
mongoose.connect('mongodb://localhost:27017/mydatabase', { useNewUrlParser: true });
app.listen(3000, () => {
console.log('Server is running on http://localhost:3000');
});
```
### 3. 前端示例:Vue3 + TypeScript
```typescript
// frontend/src/main.ts
import { createApp } from 'vue';
import App from './App.vue';
import store from './store';
createApp(App).use(store).mount('#app');
```
### 4. Vuex状态管理示例
```typescript
// frontend/src/store/index.ts
import { createStore } from 'vuex';
const store = createStore({
state: {
users: []
},
mutations: {
setUsers(state, users) {
state.users = users;