从刀耕火种到魔法工厂:原生JS到Vue的奇幻之旅

前端开发就像做菜:原生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>

原始社会的生存法则:

  1. 凡事亲力亲为:每个DOM元素都要手动创建
  2. 工具简陋innerHTML是我们唯一的石斧
  3. 生存艰难:数据更新时,整个部落都要重建(重新渲染)
  4. 容易受伤:一个拼写错误就会让整个部落陷入混乱
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>

魔法工厂的神奇之处:

  1. 声明式编程:告诉工厂"我想要什么",而不是"怎么做"

    xml 复制代码
    <!-- 告诉工厂:为每个朋友生成一行 -->
    <tr v-for="friend in friends">
  2. 数据绑定:数据和视图自动同步,告别手动更新

    kotlin 复制代码
    // 添加新朋友?直接push数据!
    this.friends.push({name: "小张", hometown: "南昌"})
  3. 组件化:把UI拆分成乐高积木

    ruby 复制代码
    <friend-card v-for="friend in friends" :friend="friend"></friend-card>
  4. 状态管理:中央数据仓库(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: 一个包含朋友信息的数组,每个元素有 namehometown 字段。
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>

✅ 总结:这个页面做了什么?

  1. 展示一个标题:"ECUT 未来之星"。

  2. 展示一个表格,列出两个朋友的信息:

    • 姓名:小王、小刘
    • 家乡:九江、赣州
  3. 使用了 Vue.js 进行数据驱动视图更新,使得页面内容可以轻松地通过修改数据来改变。

  4. 使用了 Bootstrap 提供的样式美化表格。

第三章:为什么我们需要魔法?聚焦业务!

业务逻辑 vs 底层API

在原始社会,80%的时间花在:

  1. 手动创建DOM元素
  2. 绑定/解绑事件
  3. 同步数据状态
  4. 处理浏览器兼容性

而在魔法工厂,80%的时间专注于:

  1. 数据流:数据如何流动、变化
  2. 业务逻辑:应用的核心功能
  3. 用户体验:动画、交互设计
  4. 性能优化:让魔法更高效

真实案例对比

需求:当点击朋友行时,显示详细信息

原始人解决方案

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就像建筑师的蓝图:

  1. 当数据变化时,重新绘制蓝图
  2. 比较新旧蓝图差异
  3. 只修改实际建筑中需要改变的部分

响应式系统:魔法的感应网络

Vue使用Object.definePropertyProxy创建响应式数据:

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·克拉克

现在,拿起你的魔法杖(键盘),开始创造让用户惊叹的魔法(应用)吧!

相关推荐
棉花糖超人1 小时前
【从0-1的HTML】第2篇:HTML标签
前端·html
exploration-earth1 小时前
本地优先的状态管理与工具选型策略
开发语言·前端·javascript
OpenTiny社区1 小时前
开源之夏报名倒计时3天!还有9个前端任务有余位,快来申请吧~
前端·github
ak啊1 小时前
WebGL魔法:从立方体到逼真阴影的奇妙之旅
前端·webgl
hang_bro1 小时前
使用js方法实现阻止按钮的默认点击事件&触发默认事件
前端·react.js·html
哈贝#1 小时前
vue和uniapp聊天页面右侧滚动条自动到底部
javascript·vue.js·uni-app
用户90738703648642 小时前
pnpm是如何解决幻影依赖的?
前端
树上有只程序猿2 小时前
Claude 4提升码农生产力的5种高级方式
前端
傻球2 小时前
没想到干前端2年了还能用上高中物理运动学知识
前端·react.js·开源
咚咚咚ddd2 小时前
前端组件:pc端通用新手引导组件最佳实践(React)
前端·react.js