首先我要知道一点 其能够数据变化的 都用{{}}来进行渲染类似
来看一下实现效果
实现思路 :
1,引进 vue.js
2,setup 将声明变量 方法放在setup里面
3,用响应式声明 ref() 或rective声明 可以声明对象等等 let 也可以声明 但是 不可以与页面响应
4,渲染 加价减价
<td><button class="commodity_redu" @click="item.num--" v-show="item.num>0">-</button><span>{{item.num}}</span><button
@click="add_numj(item)" class="add_plus">+</button></td>
vue代码
我们可以写在行内 @click=“item.num--”
这里的 item是我们用v-for 循环过了 所以说item是第一项 v-for的写法:
v-for=“item in list” :key=“item.id”
list是我们声明的数组
5,数量的计算: 可以使用for循环 也可以使用 reduce()的方法
看
let all_num = () => {
let num = 0
appu.value.forEach(item => {
num += item.num })
return num
}
这里是数量计算
6,价格的计算:
// 价格计算
let all_price = () => {
return appu.value.reduce((a, b) => a.num * a.price + b.num * b.price);
}
这样写还可以简写 将括号 花扩号去除掉
看完整代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<style>
* {
margin: 0;
padding: 0;
}
table {
min-width: 66%;
border-left: 1px solid lightgray;
border-top: 1px solid lightgray;
border-right: 1px solid lightgray;
text-align: center;
margin-left: 200px;
}
.add_plus{
width: 20px;
}
.add_commodity{
margin-left: 200px;
}
.edi_box{
margin-left: 200px;
}
.commodity_redu {
width: 20px;
}
.edi_ediitor{
margin: 5px;
}
/* 延迟缓慢 */
[v-cloak] {
display: none;
}
#ggid{
margin-left: 200px;
}
.active{
background-color: aquamarine;
}
</style>
</style>
<body>
<div id="app" v-cloak>
{{ message }}
<div>{{name}}</div>
<!--
<div :style="{color:tru?'#ff0000':''}">判断三元是否为true判断</div>
<input type="text" v-model="name"> -->
<!-- <div v-for="(it,index) in appu":key="index">{{it.id}}{{it.name}} -->
<!-- key的属性 -->
<!-- <input type="text" name="" id=""> -->
<!-- 头部删除 -->
<!-- <button @click="appu.shift()">删除</button> -->
<!-- </div> -->
<!-- if,else -->
<!-- <div v-if="tru"> -->
<!-- <input type="text" v-model=""> -->
<!-- </div> -->
<!-- <div v-else="tru">为false显示</div> -->
<!-- show -->
<!-- <div v-show="tru">show的方法使用的是display:none</div> -->
<!-- <button @click="tru=!tru">显示</button> -->
<!-- <button @click="tru=!tru">隐藏</button> -->
<!-- 数量 -->
<table border="1" cellspacing="0" cellpadding="0">
<thead>
<tr>
<td>商品</td>
<td>价格</td>
<td>数量</td>
<td>操作</td>
</tr>
</thead>
<!-- 循环 -->
<tbody>
<tr v-for="(item,index) in appu " :key="item.id" :style="{'background-color':item.num>0?'#00ff00':''}">
<td>{{item.name}}</td>
<td>{{item.price}}</td>
<td><button class="commodity_redu" @click="item.num--" v-show="item.num>0">-</button><span>{{item.num}}</span><button
@click="add_numj(item)" class="add_plus">+</button></td>
<td><button class="edi_ediitor" @click="edi_ieddou(item,index)">编辑</button><button @click="deletv(appu,index)" >删除</button>
</td>
</tr>
</tbody>
<tfoot>
<tr>
<td> </td>
<td>总价格:¥{{all_price()}}</td>
<td>总数量:¥{{all_num()}}</td>
<td></td>
</tr>
</tfoot>
</table>
<!-- 添加商品 -->
<button class="add_commodity" @click="addsp">添加商品</button>
<div v-if="tru" class="edi_box">
<input type="text" value="" v-model="sp">
<input type="text" value="" v-model="sl">
<button @click="yespush(appu,sp,sl)">确认</button>
<button @click="closet(appu,sp,sl)">取消</button>
</div>
<!-- 编辑 -->
<div v-show="bjtru" id="ggid">
<input type="text" name="" id="" v-model="edi_data.name">
<input type="text" name="" id="" v-model="edi_data.price">
<button @click="edi_save">确认</button>
<button @click="bjtru=!bjtru">取消</button>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@3.2.31/dist/vue.global.js"></script>
<script>
let {
createApp,
ref,
reactive
} = Vue;
createApp({
setup() {
// 数据
const appu = ref([{
id: 1,
name: '手机',
num: 0,
price: 30
},
{
id: 2,
name: '电脑',
num: 0,
price: 20
}
])
// 新增inputv-show
const tru = ref(false)
//编辑inputv-show
const bjtru = ref(false)
// 确认v-show
const grrp = ref(false)
// 数量计算
let all_num = () => {
let num = 0
appu.value.forEach(item => {
num += item.num
})
return num
}
// 价格计算
let all_price = () => {
return appu.value.reduce((a, b) => a.num * a.price + b.num * b.price);
}
// 显示新增显示
const addsp = () => {
tru.value = true
}
// 加数量
const add_numj = (item) => {
item.num++
grrp.value = true
console.log(item);
}
// kong
const edi_data = reactive({
id: 1,
name: '',
num: 0,
price: 0
})
const edi_index = ref('0')
// 编辑回显
const edi_ieddou = (item, index) => {
bjtru.value = true
Object.assign(edi_data, item)
edi_index.value = index
}
// 点击保存替换
let edi_save = () => {
appu.value[edi_index.value] = edi_data
bjtru.value = false
}
// 删除
const deletv = (appu, i) => {
appu.splice(i, 1)
}
// 点击取消
// const sp = ref('')
const closet = (appu, sp, sl) => {
tru.value = false
}
// 点击添加
const yespush = (appu, sp, sl) => {
console.log(appu);
tru.value = false
let obj = {
price: sl,
name: sp,
num: 1
}
appu.push(obj)
}
console.log(name)
return {
yespush,
closet,
deletv,
add_numj,
addsp,
tru,
bjtru,
grrp,
appu,
all_num,
all_price,
edi_ieddou,
edi_data,
edi_save
}
}
}).mount('#app')
</script>
</body>
</html>