首先我要知道一点 其能够数据变化的 都用{{}}来进行渲染类似
来看一下实现效果

实现思路 :
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>



















