vue页面的详细说明-peot.edit.html

结合前面讲解的 Vue 基本结构,以你提供的这个诗人信息管理代码为例,编写一份面向初学者的详细说明文档。

如果vue相关知识遗忘了,可以看视频复习。

https://www.bilibili.com/video/BV1m84y1w7Tb?spm_id_from=333.788.videopod.episodes\&vd_source=b3d19abb06716e3020b8286fb283316f\&p=29


Vue.js 入门实战详解 ------ 诗人信息管理页面

一、整体结构概览

这是一个基于 Vue 2 的诗人信息编辑页面,主要功能是:

  1. 从 URL 获取诗人 ID
  2. 根据 ID 查询诗人详细信息并显示在表单中
  3. 修改信息后点击"更新"按钮保存

二、HTML 结构解析(View 层)

1. 完整的 HTML 骨架

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>诗人信息编辑</title>
    <!-- 引入 Vue 核心库 -->
    <script src="./js/vue.js"></script>
    <!-- 引入 Axios(用于发送 HTTP 请求) -->
    <script src="./js/axios-0.18.0.js"></script>
</head>
<body>
    <!-- View 层:Vue 挂载的容器 -->
    <div id="app" align="center">
        <!-- 表格:展示诗人信息表单 -->
        <table border="1">
            <!-- ... 表单内容 ... -->
        </table>
        <!-- 显示当前诗人数据的 JSON 格式 -->
        {{peot}}
    </div>
</body>
<!-- Vue 实例(ViewModel) -->
<script>
    // ... Vue 代码 ...
</script>
</html>

2. 表单中的 v-model 双向绑定

html 复制代码
<tr>
    <td>编号</td>
    <td>
        <!-- v-model 实现双向数据绑定 -->
        <input type="text" v-model="this.id">
    </td>
</tr>
<tr>
    <td>姓名</td>
    <td>
        <input type="text" v-model="peot.author">
    </td>
</tr>
<tr>
    <td>性别</td>
    <td>
        <!-- 单选框:绑定同一个数据字段 -->
        <input type="radio" name="gender" v-model="peot.gender" value="1"> 男
        <input type="radio" name="gender" v-model="peot.gender" value="0"> 女
    </td>
</tr>
v-model 原理解析

v-model 是 Vue 提供的双向数据绑定指令,它本质上是语法糖:

复制代码
┌─────────────────────────────────────────────┐
│           v-model 工作原理                    │
│                                              │
│  用户输入 ──→ 更新 data ──→ 自动更新视图     │
│      ↑                        ↓              │
│      └────────────────────────┘              │
│         双向绑定(自动同步)                   │
└─────────────────────────────────────────────┘

对于输入框:

html 复制代码
<!-- 这行代码 -->
<input v-model="peot.author">

<!-- 等价于 -->
<input 
    :value="peot.author"           <!-- 单向绑定:数据 → 视图 -->
    @input="peot.author = $event.target.value"  <!-- 事件监听:视图 → 数据 -->
>

对于单选框:

html 复制代码
<!-- 当 peot.gender = '1' 时,"男" 被选中 -->
<input type="radio" v-model="peot.gender" value="1"> 男
<!-- 当 peot.gender = '0' 时,"女" 被选中 -->
<input type="radio" v-model="peot.gender" value="0"> 女

3. @click 事件绑定

html 复制代码
<input type="button" @click="updatePeot" value="更新">
  • @clickv-on:click 的简写
  • 点击按钮时,会调用 Vue 实例中的 updatePeot 方法
  • 原理:Vue 通过事件监听,在用户点击时执行对应的 JavaScript 逻辑

4. 插值表达式 {``{peot}}

html 复制代码
{{peot}}
  • {``{ }} 是 Vue 的插值语法(Mustache 语法)
  • data 中的 peot 对象转换为 JSON 字符串并显示在页面上
  • peot 数据变化时,这里会自动更新

三、Vue 实例解析(ViewModel 层)

1. 创建 Vue 实例

javascript 复制代码
new Vue({
    el: '#app',        // 挂载点:Vue 控制 id="app" 的容器
    data: {            // 响应式数据
        id: '',
        peot: {},      // 存储诗人详情(初始为空对象)
    },
    methods: {         // 方法定义
        selectById() { /* ... */ },
        updatePeot() { /* ... */ }
    },
    created() {        // 生命周期钩子
        // 页面加载时自动执行
    }
})

2. data ------ 响应式数据

javascript 复制代码
data: {
    id: '',          // 存储从 URL 获取的诗人 ID
    peot: {},        // 存储诗人详情对象
}

响应式原理:

  • this.peot 被赋值后,页面中所有使用 {``{peot}}v-model="peot.xxx" 的地方都会自动更新
  • 这是通过 Vue 的数据劫持(Object.defineProperty)实现的
javascript 复制代码
// 当执行这行代码时
this.peot = { author: '李白', dynasty: '唐' }

// Vue 会:
// 1. 更新内存中的数据
// 2. 通知所有依赖这个数据的地方
// 3. 自动重新渲染 DOM

3. methods ------ 业务逻辑方法

(1) selectById() ------ 查询诗人详情
javascript 复制代码
selectById() {
    // 构造请求 URL(使用模板字符串)
    var url = `peots/${this.id}`
    
    // 发送 GET 请求
    axios.get(url)
        .then(response => {
            var baseResult = response.data
            if (baseResult.code == 1) {
                // 请求成功,将数据赋值给 peot
                this.peot = baseResult.data
                // 此时,表单中的所有 v-model 会自动显示数据
            }
        })
        .catch(error => { 
            // 错误处理
        })
}

关键点解释:

代码 说明
this.id 访问 data 中的 id 数据
peots/${this.id} ES6 模板字符串,${} 中可嵌入表达式
axios.get(url) 发送异步 GET 请求
.then(response => {}) 请求成功的回调(箭头函数)
this.peot = baseResult.data 更新数据,触发视图更新

为什么使用箭头函数?

javascript 复制代码
// 箭头函数(推荐)
.then(response => {
    this.peot = response.data  // this 指向 Vue 实例
})

// 普通函数(不推荐)
.then(function(response) {
    this.peot = response.data  // this 指向 window,会报错!
})

(2) updatePeot() ------ 更新诗人信息
javascript 复制代码
updatePeot() {
    var url = 'peotupdate'
    // 发送 POST 请求,将 peot 对象作为请求体
    axios.post(url, this.peot)
        .then(res => {
            var baseResult = res.data
            if (baseResult.code == 1) {
                // 更新成功,跳转到列表页
                location.href = 'peot_listAll.html'
            } else {
                // 更新失败,弹出提示
                alert(baseResult.message)
            }
        })
        .catch(err => {
            console.error(err)
        })
}

数据流:

复制代码
用户在表单修改 → v-model 更新 this.peot → 点击"更新" → 
调用 updatePeot() → axios.post 发送数据 → 
后端处理 → 返回结果 → 跳转或提示

4. created() ------ 生命周期钩子

javascript 复制代码
created() {
    // 1. 从 URL 中提取 id 参数
    this.id = location.href.split("?id=")[1]
    // 例如:http://xxx.com/peot_edit.html?id=5
    // 提取后:this.id = "5"
    
    // 2. 调用方法,查询诗人详情
    this.selectById()
}

执行时机:

  • Vue 实例创建完成后自动执行
  • 此时 datamethods 已经初始化完成
  • 适合做数据初始化

完整流程:

复制代码
页面加载
    ↓
new Vue() 创建实例
    ↓
初始化 data、methods
    ↓
created() 自动执行 ← 这里获取 id 并查询数据
    ↓
axios 发送异步请求
    ↓
数据返回,更新 this.peot
    ↓
视图自动更新(表单显示数据)

四、完整数据流图解

复制代码
┌─────────────────────────────────────────────────────────────┐
│                      完整数据流                              │
│                                                              │
│  1. 页面加载                                                 │
│     ↓                                                       │
│  2. created() 执行                                          │
│     ├── this.id = location.href.split("?id=")[1]           │
│     └── this.selectById()                                  │
│         ↓                                                  │
│  3. axios.get(`peots/${this.id}`)                         │
│     ↓                                                  │
│  4. 后端返回数据                                           │
│     ↓                                                  │
│  5. this.peot = response.data                            │
│     ↓                                                  │
│  6. 视图自动更新                                          │
│     ├── 表单输入框显示数据(v-model)                    │
│     └── {{peot}} 显示 JSON 数据                         │
│                                                          │
│  7. 用户修改表单                                          │
│     ↓                                                  │
│  8. v-model 自动更新 this.peot                          │
│     ↓                                                  │
│  9. 点击"更新"按钮                                       │
│     ↓                                                  │
│  10. @click="updatePeot"                               │
│      ↓                                                │
│  11. axios.post('peotupdate', this.peot)              │
│      ↓                                                │
│  12. 后端处理完成,跳转到列表页                        │
└─────────────────────────────────────────────────────────────┘

五、初学者常见问题

1. 为什么 peot 是空对象 {}

  • 因为初始时还没有数据,先定义空对象防止报错
  • 等异步请求返回后,再赋值

2. 为什么 iddata 中定义,又通过 location.href 赋值?

  • data 中的 id 是响应式的,方便在其他地方使用
  • created 中赋值是初始化过程

六、核心知识点总结

概念 说明 本例中的应用
Vue 实例 应用的核心,连接数据和视图 new Vue({...})
el 挂载点,指定 Vue 控制的范围 el: '#app'
data 响应式数据存储 idpeot
methods 定义业务方法 selectById()updatePeot()
生命周期 实例不同阶段自动执行的函数 created()
v-model 双向数据绑定 表单输入与 peot 数据同步
@click 事件绑定 @click="updatePeot"
{{}} 插值表达式 {``{peot}} 显示数据
axios 发送 HTTP 请求 查询和更新数据