feat: add Vue2 exercises for dynamic styles, lifecycle methods, component communication, and course management dashboard
- Implement dynamic styles and event handling in Vue2 with a card component. - Create lifecycle methods exercise to simulate async data loading and instance destruction. - Develop a component communication exercise with props, events, and slots. - Build a comprehensive course management dashboard with filtering, statistics, and component interactions.
This commit is contained in:
31
07-vue2/03-v-model-and-form/README.md
Normal file
31
07-vue2/03-v-model-and-form/README.md
Normal file
@@ -0,0 +1,31 @@
|
||||
# 练习 3:v-model 和表单
|
||||
|
||||
## 目标
|
||||
|
||||
学会用 `v-model` 处理输入、选择和实时预览。
|
||||
|
||||
## 你要练什么
|
||||
|
||||
- `v-model`
|
||||
- 输入框
|
||||
- 多行文本
|
||||
- 下拉框
|
||||
- 单选框
|
||||
- 复选框
|
||||
|
||||
## 任务
|
||||
|
||||
请基于页面结构完成以下操作:
|
||||
|
||||
- 输入昵称并实时显示
|
||||
- 输入学习目标并实时显示
|
||||
- 选择当前阶段并显示结果
|
||||
- 选择偏好的学习节奏
|
||||
- 勾选已经掌握的基础能力
|
||||
|
||||
## 文件
|
||||
|
||||
- [starter.html](/Users/lijiaqing/home/wwwroot/front-end-example/07-vue2/03-v-model-and-form/starter.html)
|
||||
- [starter.js](/Users/lijiaqing/home/wwwroot/front-end-example/07-vue2/03-v-model-and-form/starter.js)
|
||||
- [answer.html](/Users/lijiaqing/home/wwwroot/front-end-example/07-vue2/03-v-model-and-form/answer.html)
|
||||
- [answer.js](/Users/lijiaqing/home/wwwroot/front-end-example/07-vue2/03-v-model-and-form/answer.js)
|
||||
59
07-vue2/03-v-model-and-form/answer.html
Normal file
59
07-vue2/03-v-model-and-form/answer.html
Normal file
@@ -0,0 +1,59 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>v-model 和表单</title>
|
||||
<style>
|
||||
body { margin: 0; padding: 32px; font-family: "PingFang SC", sans-serif; background: #f7f9fc; }
|
||||
.wrap { max-width: 760px; margin: 0 auto; display: grid; gap: 18px; }
|
||||
.card { padding: 22px; border-radius: 18px; background: #fff; border: 1px solid #dde5f3; }
|
||||
input, textarea, select { width: 100%; margin-top: 8px; padding: 12px; border-radius: 12px; border: 1px solid #cfd8ea; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<section id="app" class="wrap">
|
||||
<article class="card">
|
||||
<label>
|
||||
昵称
|
||||
<input v-model="nickname" type="text" placeholder="请输入昵称" />
|
||||
</label>
|
||||
<label>
|
||||
学习目标
|
||||
<textarea v-model="goal" rows="4" placeholder="请输入学习目标"></textarea>
|
||||
</label>
|
||||
<label>
|
||||
当前阶段
|
||||
<select v-model="stage">
|
||||
<option value="入门">入门</option>
|
||||
<option value="进阶">进阶</option>
|
||||
<option value="项目实战">项目实战</option>
|
||||
</select>
|
||||
</label>
|
||||
<div style="margin-top: 16px;">
|
||||
<p>偏好的学习节奏</p>
|
||||
<label><input v-model="pace" type="radio" value="每天学习" /> 每天学习</label>
|
||||
<label><input v-model="pace" type="radio" value="每周集中学习" /> 每周集中学习</label>
|
||||
</div>
|
||||
<div style="margin-top: 16px;">
|
||||
<p>已掌握的基础能力</p>
|
||||
<label><input v-model="skills" type="checkbox" value="HTML" /> HTML</label>
|
||||
<label><input v-model="skills" type="checkbox" value="CSS" /> CSS</label>
|
||||
<label><input v-model="skills" type="checkbox" value="JavaScript" /> JavaScript</label>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<article class="card">
|
||||
<h2>实时预览</h2>
|
||||
<p>昵称:{{ nickname || "未填写" }}</p>
|
||||
<p>学习目标:{{ goal || "还没有输入目标" }}</p>
|
||||
<p>当前阶段:{{ stage }}</p>
|
||||
<p>学习节奏:{{ pace }}</p>
|
||||
<p>已掌握:{{ skills.length ? skills.join("、") : "还没有勾选" }}</p>
|
||||
</article>
|
||||
</section>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
|
||||
<script src="./answer.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
10
07-vue2/03-v-model-and-form/answer.js
Normal file
10
07-vue2/03-v-model-and-form/answer.js
Normal file
@@ -0,0 +1,10 @@
|
||||
new Vue({
|
||||
el: "#app",
|
||||
data: {
|
||||
nickname: "林晨",
|
||||
goal: "希望独立完成一个 Vue2 管理后台页面。",
|
||||
stage: "进阶",
|
||||
pace: "每周集中学习",
|
||||
skills: ["HTML", "CSS"],
|
||||
},
|
||||
});
|
||||
59
07-vue2/03-v-model-and-form/starter.html
Normal file
59
07-vue2/03-v-model-and-form/starter.html
Normal file
@@ -0,0 +1,59 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>v-model 和表单</title>
|
||||
<style>
|
||||
body { margin: 0; padding: 32px; font-family: "PingFang SC", sans-serif; background: #f7f9fc; }
|
||||
.wrap { max-width: 760px; margin: 0 auto; display: grid; gap: 18px; }
|
||||
.card { padding: 22px; border-radius: 18px; background: #fff; border: 1px solid #dde5f3; }
|
||||
input, textarea, select { width: 100%; margin-top: 8px; padding: 12px; border-radius: 12px; border: 1px solid #cfd8ea; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<section id="app" class="wrap">
|
||||
<article class="card">
|
||||
<label>
|
||||
昵称
|
||||
<input v-model="nickname" type="text" placeholder="请输入昵称" />
|
||||
</label>
|
||||
<label>
|
||||
学习目标
|
||||
<textarea v-model="goal" rows="4" placeholder="请输入学习目标"></textarea>
|
||||
</label>
|
||||
<label>
|
||||
当前阶段
|
||||
<select v-model="stage">
|
||||
<option value="入门">入门</option>
|
||||
<option value="进阶">进阶</option>
|
||||
<option value="项目实战">项目实战</option>
|
||||
</select>
|
||||
</label>
|
||||
<div style="margin-top: 16px;">
|
||||
<p>偏好的学习节奏</p>
|
||||
<label><input v-model="pace" type="radio" value="每天学习" /> 每天学习</label>
|
||||
<label><input v-model="pace" type="radio" value="每周集中学习" /> 每周集中学习</label>
|
||||
</div>
|
||||
<div style="margin-top: 16px;">
|
||||
<p>已掌握的基础能力</p>
|
||||
<label><input v-model="skills" type="checkbox" value="HTML" /> HTML</label>
|
||||
<label><input v-model="skills" type="checkbox" value="CSS" /> CSS</label>
|
||||
<label><input v-model="skills" type="checkbox" value="JavaScript" /> JavaScript</label>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<article class="card">
|
||||
<h2>实时预览</h2>
|
||||
<p>昵称:{{ nickname }}</p>
|
||||
<p>学习目标:{{ goal }}</p>
|
||||
<p>当前阶段:{{ stage }}</p>
|
||||
<p>学习节奏:{{ pace }}</p>
|
||||
<p>已掌握:{{ skills.join("、") }}</p>
|
||||
</article>
|
||||
</section>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
|
||||
<script src="./starter.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
10
07-vue2/03-v-model-and-form/starter.js
Normal file
10
07-vue2/03-v-model-and-form/starter.js
Normal file
@@ -0,0 +1,10 @@
|
||||
new Vue({
|
||||
el: "#app",
|
||||
data: {
|
||||
nickname: "",
|
||||
goal: "",
|
||||
stage: "入门",
|
||||
pace: "每天学习",
|
||||
skills: [],
|
||||
},
|
||||
});
|
||||
Reference in New Issue
Block a user