背景介绍
购物车是商城类应用里必不可少的功能,接下来,我们将使用 vue 实现一个购物车列表。
本题已经内置了初始代码,打开实验环境,目录结构如下:
├── carList.json # json 数据
├── css # 样式文件夹
│ ├── element-ui.css
│ └── index.css
├── images # 图片文件夹
│ ├── img1.jpg
│ ├── img2.jpg
│ ├── img3.jpg
│ └── img4.jpg
├── index.html
└── js # 项目中用到的 js 文件
├── axios.js
├── element-ui.js
└── vue.js
其中:
css
存放项目样式。js
存放项目中用到的 js 文件。images
存放项目中用到的图片。carList.json
存放本次挑战需要请求的数据。index.html
是本次挑战需要完善的布局页面。在代码中需要修改的部分有相关提示,请仔细阅读,然后完善
index.html
中的 js 部分代码,请求数据,并让数据正确显示到页面上,完成后效果如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>购物车</title>
<script src="./js/vue.js"></script>
<script src="./js/axios.js"></script>
<link rel="stylesheet" href="./css/element-ui.css">
<link rel="stylesheet" href="./css/index.css">
</head>
<body>
<div class="container" id="app">
<h4>购物车</h4>
<!-- 购物车列表 -->
<div>
<el-card class="box-card" v-for="(item,index) in carlist">
<!-- 商品图片 -->
<img :src="item.img">
<div>
<span>
<!-- 商品名称 -->
{
{item.name}}
</span>
<div class="bottom clearfix">
<el-button type="text" class="button" @click=add(index)>+</el-button>
<el-button type="text" class="button">
<!-- 商品数量 -->
{
{item.num}}
</el-button>
<el-button type="text" class="button" @click=dec(index)>-</el-button>
</div>
</div>
</el-card>
</div>
</div>
</div>
<!-- 引入组件库 -->
<script src="./js/element-ui.js"></script>
<script>
new Vue({
el: "#app",
data: {
carlist: [] //购物车列表
},
created() {
// 在这里使用axios 发送请求
axios.get("./carList.json").then(res => {
console.log(res.data)
this.carlist = res.data
})
},
methods: {
add(index) {
this.carlist[index].num++
},
dec(index) {
if (this.carlist[index].num >= 1) {
this.carlist[index].num--
}
}
}
})
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>购物车</title>
<script src="./js/vue.js"></script>
<script src="./js/axios.js"></script>
<link rel="stylesheet" href="./css/element-ui.css">
<link rel="stylesheet" href="./css/index.css">
</head>
<body>
<div class="container" id="app">
<h4>购物车</h4>
<!-- 购物车列表 -->
<div>
<el-card class="box-card" v-for="(item,index) in carlist">
<!-- 商品图片 -->
<img :src="item.img">
<div>
<span>
<!-- 商品名称 -->
{
{item.name}}
</span>
<div class="bottom clearfix">
<el-button type="text" class="button" @click=add(index)>+</el-button>
<el-button type="text" class="button">
<!-- 商品数量 -->
{
{item.num}}
</el-button>
<el-button type="text" class="button" @click=dec(index)>-</el-button>
</div>
</div>
</el-card>
</div>
</div>
</div>
<!-- 引入组件库 -->
<script src="./js/element-ui.js"></script>
<script>
// JavaScript部分(Vue实例)
</script>
</body>
</html>
HTML 结构和头部信息:
<!DOCTYPE html>
:声明该文档为 HTML5 文档。<html lang="en">
:指定文档语言为英语。<head>
部分: <meta charset="UTF-8">
:设置字符编码为 UTF-8,确保页面可以正确显示各种字符。<meta http-equiv="X-UA-Compatible" content="IE=edge">
:针对 Internet Explorer 浏览器,确保使用最新的渲染引擎。<meta name="viewport" content="width=device-width, initial-scale=1.0">
:设置视口,使页面在不同设备上能自适应显示。<title>购物车</title>
:设置页面标题为 "购物车"。<script src="./js/vue.js"></script>
:引入 Vue.js 库,为页面提供 Vue 框架支持。<script src="./js/axios.js"></script>
:引入 axios 库,用于发送 HTTP 请求。<link rel="stylesheet" href="./css/element-ui.css">
:引入 Element UI 的样式表,为页面提供 UI 组件的样式。<link rel="stylesheet" href="./css/index.css">
:引入自定义的样式表,可能包含一些自定义的样式。<body>
部分: <div class="container" id="app">
:Vue 实例挂载的根元素,id
为 app
,这是 Vue 应用的容器。<h4>购物车</h4>
:显示一个标题 "购物车"。<el-card class="box-card" v-for="(item,index) in carlist">
:使用 v-for
指令遍历 carlist
数组,为数组中的每个元素创建一个 el-card
组件。 <img :src="item.img">
:使用 v-bind
指令(简写为 :
)绑定 img
元素的 src
属性,将 item.img
的值作为图片的源。<span>{ {item.name}}</span>
:使用双大括号插值表达式显示商品名称。<div class="bottom clearfix">
:一个包含操作按钮的 div
元素。 <el-button type="text" class="button" @click=add(index)>+</el-button>
:使用 @click
指令监听点击事件,调用 add
方法并传递 index
参数,点击按钮会增加商品数量。<el-button type="text" class="button">{ {item.num}}</el-button>
:显示商品数量。<el-button type="text" class="button" @click=dec(index)>-</el-button>
:使用 @click
指令监听点击事件,调用 dec
方法并传递 index
参数,点击按钮会减少商品数量。new Vue({
el: "#app",
data: {
carlist: [] //购物车列表
},
created() {
// 在这里使用 axios 发送请求
axios.get("./carList.json").then(res => {
console.log(res.data)
this.carlist = res.data
})
},
methods: {
add(index) {
this.carlist[index].num++
},
dec(index) {
if (this.carlist[index].num >= 1) {
this.carlist[index].num--
}
}
}
})
Vue 实例创建:
new Vue({...})
:创建一个 Vue 实例。el: "#app"
:将 Vue 实例挂载到 id
为 app
的元素上。data
属性: carlist: []
:定义一个名为 carlist
的数组,用于存储购物车中的商品信息,初始化为空数组。created
生命周期钩子: axios.get("./carList.json").then(res => {...})
:在 Vue 实例创建后,使用 axios 发送一个 GET 请求到 ./carList.json
文件。console.log(res.data)
:打印从服务器获取的数据。this.carlist = res.data
:将从服务器获取的数据存储在 carlist
数组中。methods
属性: add(index)
: this.carlist[index].num++
:点击 +
按钮时,会调用该方法,将 carlist
数组中对应 index
的商品数量加 1。dec(index)
: if (this.carlist[index].num >= 1) {...}
:点击 -
按钮时,调用该方法,如果商品数量大于或等于 1,将 carlist
数组中对应 index
的商品数量减 1。//carList.json
[
{
"id": 6,
"name": "橘子",
"price": 3.9,
"num": 1,
"img": "./images/img1.jpg"
},
{
"id": 7,
"name": "车厘子",
"price": 138.8,
"num": 2,
"img": "./images/img2.jpg"
},
{
"id": 7,
"name": "草莓",
"price": 28.5,
"num": 3,
"img": "./images/img3.jpg"
},
{
"id": 7,
"name": "菠萝",
"price": 9.8,
"num": 4,
"img": "./images/img4.jpg"
}
]
数据结构和内容:这是一个 JSON 数组,每个元素是一个对象,代表购物车中的一种商品。
id
:商品的唯一标识符(不过这里部分 id
重复,实际开发中最好保证 id
的唯一性)。name
:商品的名称,如 "橘子"、"车厘子" 等,用于在购物车中显示商品名称。price
:商品的单价,用于计算总价等操作。num
:商品的数量,与 HTML 部分中的商品数量显示和操作按钮相关联。img
:商品图片的路径,用于在页面上显示商品的图片。4. 工作流程 ▶️
id
为 app
的元素上。data
中的 carlist
数组为空数组。created
生命周期钩子时,使用 axios 发送一个 GET 请求到 ./carList.json
。carlist
数组中。carlist
数组的内容使用 v-for
指令动态生成购物车列表。carlist
中的每个商品,显示商品图片(通过 item.img
)、商品名称(通过 item.name
)和商品数量(通过 item.num
)。+
和 -
按钮绑定点击事件,分别调用 add
和 dec
方法。+
按钮时,会调用 add
方法,根据传递的 index
增加对应商品的数量。-
按钮时,会调用 dec
方法,根据传递的 index
减少对应商品的数量,但不会让数量小于 0。 小总结:
该代码通过 Vue.js 框架实现了一个简单的购物车功能。它利用 Vue 的数据绑定(v-bind
、双大括号插值)和指令(v-for
、@click
),结合 axios 进行数据请求,将服务器的数据渲染为购物车列表,并提供了增加和减少商品数量的交互功能。同时使用了 Element UI 组件库来美化界面,使页面更加美观和易用。