1、table表格标签
是用于定义表格的标签;
<thead> 表头部(放表格的标题之类);
<tbody> 表主体(放表格主体数据);表脚注(放表格脚注);
标签用于定义表格中的行,必须嵌套在 标签中;
用于定义表格中的单元格,即数据单元格的内容,必须嵌套在 标签中;
表格样式设置:
- <style>
- table {
- width: 600px;
- color: 8f8e8e;
- text-align: center;
- border-collapse: collapse;
- }
- table thead {
- background-color: aqua;
- }
- table tr {
- height: 30px;
- line-height: 30px;
- border: 1px solid #ececec;
- }
- style>
2、let声明变量
let和var的作用差不多,但let声明的范围是块作用域,而var声明的范围是函数作用域。

完整示例代码:
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Document</title>
- <style>
- table {
- width: 600px;
- color: 8f8e8e;
- text-align: center;
- border-collapse: collapse;
- }
- table thead {
- background-color: aqua;
- }
- table tr {
- height: 30px;
- line-height: 30px;
- border: 1px solid #ececec;
- }
- </style>
- </head>
- <body>
- <div id="app">
- <table>
- <thead>
- <tr>
- <td><input type="checkbox" v-model="data.selected" @change="selectAll"/></td>
- <td>商品</td>
- <td>单价</td>
- <td>库存</td>
- <td colspan="2">操作</td>
- </tr>
- </thead>
- <tbody>
- <tr v-for="(value, index) in data.list">
- <td><input type="checkbox" :value="value" v-model="data.checkboxList" @change="checkSelect"/></td>
- <td>{{value.name}}</td>
- <td>{{value.price}}</td>
- <td>{{value.stock}}</td>
- <td>
- <button @click="sub(value)">-</button>
- {{value.number}}
- <button @click="add(value)">+</button>
- </td>
- <td><button @click="del(index,value.id)">删除</button></td>
- </tr>
- </tbody>
- <tfoot>
- <tr>
- <td>总价{{totalPrice()}}</td>
- </tr>
- </tfoot>
- </table>
- </div>
- <script type="module">
- import {createApp, reactive} from './vue.esm-browser.js'
- // const {createApp, reactive} = Vue
- createApp({
- // setup选项,用于设置响应式数据和方法等
- setup(){
- const data = reactive({
- selected:false,
- checkboxList:[],
- list:[{
- id:1,
- name:"铅笔",
- price:10,
- number:5,
- stock:20
- },
- {
- id:2,
- name:"鼠标",
- price:20,
- number:5,
- stock:8
- },
- {
- id:3,
- name:"键盘",
- price:40,
- number:4,
- stock:7
- }],
- })
- const selectAll = () =>{
- console.log(data.selected)
- if(data.selected){
- data.checkboxList = data.list
- }
- else{
- data.checkboxList = []
- }
- console.log(data.checkboxList)
- }
- const checkSelect = () =>{
- if (data.checkboxList.length == data.list.length && data.list.length != 0){
- data.selected = true
- }
- else{
- data.selected = false
- }
- }
- const totalPrice = () =>{
- let total = 0
- console.log(data.checkboxList)
- for(let i = 0; i < data.checkboxList.length; i++){
- total += data.checkboxList[i].price*data.checkboxList[i].number
- }
- return total
- }
- const sub = (value) =>{
- value.number --
- if(value.number <= 1){
- value.number = 1
- }
- }
- const add =(value) =>{
- value.number++
- if(value.number >= value.stock){
- value.number = value.stock
- }
- }
- const del = (index,id) =>{
- data.list.splice(index,1)
- let newArr = data.checkboxList.filter((value,index) =>{
- return value.id != id
- })
- data.checkboxList = newArr
- checkSelect()
- }
- return{
- data,
- selectAll,
- checkSelect,
- totalPrice,
- add,
- sub,
- del
- }
- }
- }).mount("#app")
- // mount为挂载
- </script>
- </body>
- </html>
去掉checkbox的change事件,添加如下代码:
- let flag = true
- watch(()=>data.selected,(newValue,oldValue)=>{
- // console.log("newValue:",newValue,"oldValue:",oldValue)
- if(newValue){
- data.checkboxList = data.list
- }
- else{
- if(flag){
- data.checkboxList = []
- }
- }
- })
-
- watch(()=>data.checkboxList,(newValue,oldValue)=>{
- console.log("newValue:",newValue.length,"oldValue:",oldValue)
- console.log(data.list.length)
- if (newValue.length == data.list.length && data.list.length != 0){
- data.selected = true
- flag = true
- }
- else{
- flag = false
- data.selected = false
- }
- })
-
- const totalPrice = computed(() => {
- return data.checkboxList.reduce((total, item) => total + item.price * item.number, 0)
- })
reduce定义:用于对数组中所有元素进行迭代操作,并将每次操作的结果累加到一个初始值上;
输入参数:累加器函数、初始值,total(累加器)用于存储每次计算的结果,初始值为0,item(当前元素)在每次迭代过程中,当前元素的值会被传递给回调函数;