前端开发就像做菜:原生JS是自己种菜、磨刀、生火;Vue/React则是米其林厨房,让你专注于创造美味
第一章:原始社会的"刀耕火种" - 原生JS时代
想象一下,你是一个原始部落的前端猎人,每天都要手动制作工具(操作DOM)来捕获数据这头猛犸象。这就是我们的第一个代码片段:
xml
<!-- 原始人搭建的茅草屋(HTML结构) -->
<div class="container">
<table id="friends" class="table table-striped">
<thead><!-- 省略 --></thead>
<tbody><!-- 待填充 --></tbody>
</table>
</div>
<script>
// 我们的狩猎工具(原生JS)
const oBody = document.querySelector("#friends tbody")
const friends = [ /* 好友数据 */ ];
// 手动制作武器:拼接HTML字符串
oBody.innerHTML = friends.map(friend =>
`<tr>
<td>${friend.name}</td>
<td>${friend.hometown}</td>
</tr>`
).join('')
</script>
原始社会的生存法则:
- 凡事亲力亲为:每个DOM元素都要手动创建
- 工具简陋 :
innerHTML
是我们唯一的石斧 - 生存艰难:数据更新时,整个部落都要重建(重新渲染)
- 容易受伤:一个拼写错误就会让整个部落陷入混乱
javascript
// 原始人添加新朋友的方式(低效且危险)
function addNewFriend(name, hometown) {
const newRow = document.createElement('tr');
newRow.innerHTML = `
<td>${name}</td>
<td>${hometown}</td>
`;
oBody.appendChild(newRow);
// 别忘了绑定事件,否则...
newRow.addEventListener('click', handleClick);
}
第二章:工业革命 - Vue的魔法工厂
突然有一天,天空中降下一位名叫尤雨溪的魔法师,他带来了Vue这座魔法工厂:
xml
<div class="container" id="app">
<h1>{{title}}</h1>
<table>
<!-- 魔法开始的地方 -->
<tr v-for="friend in friends">
<td>{{friend.name}}</td>
<td>{{friend.hometown}}</td>
</tr>
</table>
</div>
<script>
// 创建魔法工厂(Vue应用)
const App = {
data() {
return {
title: "ECUT 未来之星",
friends: [ /* 数据 */ ]
}
}
}
// 启动魔法引擎!
Vue.createApp(App).mount("#app")
</script>
魔法工厂的神奇之处:
-
声明式编程:告诉工厂"我想要什么",而不是"怎么做"
xml<!-- 告诉工厂:为每个朋友生成一行 --> <tr v-for="friend in friends">
-
数据绑定:数据和视图自动同步,告别手动更新
kotlin// 添加新朋友?直接push数据! this.friends.push({name: "小张", hometown: "南昌"})
-
组件化:把UI拆分成乐高积木
ruby<friend-card v-for="friend in friends" :friend="friend"></friend-card>
-
状态管理:中央数据仓库(Vuex/Pinia)让部落管理更高效
初识vue
js
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
// 引入 [Bootstrap]() CSS 框架(版本 3.3.6),用于美化页面样式,例如表格、按钮等
<title>聚焦于业务,而不是底层API</title>
</head>
<body>
<div class="container" id="app">
<h1>{{title}}</h1>
<table id="friends" class="table table-striped">
<thead>
<tr>
<th>姓名</th>
<th>家乡</th>
</tr>
</thead>
<tbody>
<tr v-for="friend in friends">
<td>{{friend.name}}</td>
<td>{{friend.hometown}}</td>
</tr>
</tbody>
</table>
</div>
<script src="https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/vue/3.2.31/vue.global.min.js"></script>
// 引入 Vue.js 的核心库(版本 3.2.31)
<script>
// html + css 看到页面 为了让页面尽快出来,css放在头部引用
// js 交互的,可以晚一步 不会去和html + css 争抢时间
// js 应该放在页面底部引用
// 做一个App
const App = {
// 声明数据的业务
data() {
return {
title: "ECUT 未来之星",
friends: [
{
"name": "小王",
hometown: "九江"
},
{
"name": "小刘",
"hometown": "赣州"
},
]
}
}
}
// 挂载点
Vue.createApp(App).mount("#app")
</script>
</body>
</html>
我们来分开的解释一下上述代码
Vue 实例创建与数据绑定
javascript
const App = {
data() {
return {
title: "ECUT 未来之星",
friends: [
{ "name": "小王", "hometown": "九江" },
{ "name": "小刘", "hometown": "赣州" }
]
}
}
}
-
定义了一个 Vue 应用对象
App
,其中包含数据对象data()
。 -
data()
返回两个数据:title
: 标题文本。friends
: 一个包含朋友信息的数组,每个元素有name
和hometown
字段。
scss
Vue.createApp(App).mount("#app")
- 创建 Vue 应用并挂载到
id="app"
的 DOM 元素上。也就是包裹表格的大盒子 - 这样 Vue 就会自动将数据渲染到页面中。
传入我们的数据对象的title内容需要用{{}}包裹
js
<h1>{{title}}</h1>//传入我们的数据对象的title内容
使用了 Vue 的 v-for
指令 ,用于在 HTML 中循环渲染元素 。具体来说,它会在 <table>
的 <tbody>
中根据 friends
数据数组动态生成多个 <tr>
(表格行) 。其实就是类似于遍历一个对象所有的循环
js
<tr v-for="friend in friends">
<td>{{friend.name}}</td>
<td>{{friend.hometown}}</td>
</tr>
✅ 总结:这个页面做了什么?
-
展示一个标题:"ECUT 未来之星"。
-
展示一个表格,列出两个朋友的信息:
- 姓名:小王、小刘
- 家乡:九江、赣州
-
使用了 Vue.js 进行数据驱动视图更新,使得页面内容可以轻松地通过修改数据来改变。
-
使用了 Bootstrap 提供的样式美化表格。
第三章:为什么我们需要魔法?聚焦业务!
业务逻辑 vs 底层API
在原始社会,80%的时间花在:
- 手动创建DOM元素
- 绑定/解绑事件
- 同步数据状态
- 处理浏览器兼容性
而在魔法工厂,80%的时间专注于:
- 数据流:数据如何流动、变化
- 业务逻辑:应用的核心功能
- 用户体验:动画、交互设计
- 性能优化:让魔法更高效
真实案例对比
需求:当点击朋友行时,显示详细信息
原始人解决方案:
javascript
// 在渲染后绑定事件
const rows = document.querySelectorAll('tr');
rows.forEach(row => {
row.addEventListener('click', () => {
const name = row.children[0].textContent;
alert(`${name}的详细信息...`);
});
});
// 添加新行时别忘了绑定事件!
// 删除行时别忘了解绑事件!
// 数据更新时...(头大)
魔法工厂解决方案:
ini
<tr v-for="friend in friends" @click="showDetail(friend)">
javascript
methods: {
showDetail(friend) {
alert(`${friend.name}来自${friend.hometown}`);
}
}
第四章:魔法背后的秘密 - 现代框架原理
虚拟DOM:魔法的核心引擎
虚拟DOM就像建筑师的蓝图:

- 当数据变化时,重新绘制蓝图
- 比较新旧蓝图差异
- 只修改实际建筑中需要改变的部分
响应式系统:魔法的感应网络
Vue使用Object.defineProperty
或Proxy
创建响应式数据:
javascript
const data = { count: 0 };
// Vue内部魔法
Object.defineProperty(data, 'count', {
get() {
console.log('有人在读取count!');
return value;
},
set(newValue) {
console.log('count变化了,通知视图更新!');
value = newValue;
updateView();
}
});
组件化:乐高积木哲学
arduino
// 定义一个朋友卡片组件
app.component('friend-card', {
props: ['friend'],
template: `
<div class="card">
<h3>{{ friend.name }}</h3>
<p>来自: {{ friend.hometown }}</p>
</div>
`
});
结语:拥抱变化,享受创造
从刀耕火种的原生JS到魔法工厂般的Vue/React,前端开发的进化史就是一部人类追求效率的史诗。
记住:
- 框架是工具,不是目的
- 理解原理比会用API更重要
- 业务逻辑永远是你的核心价值
最后,分享一句魔法师的箴言:
"任何足够先进的科技,皆与魔法无异。"
------亚瑟·C·克拉克
现在,拿起你的魔法杖(键盘),开始创造让用户惊叹的魔法(应用)吧!