当前位置: 首页 > news >正文

三个小时学完vue3 —— 简单案例(二)

三个小时学完vue3(二)

图片轮播案例

<!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>
<body>
    <div id="app">
        <h3>{{ number }}</h3>

        <img :src=`./imgs/${number}.jpg` style="width: 300px;"> <hr>
        <button @click="prev">上一张</button>
        <button @click="next">下一张</button>

        <hr>
        <ul>
            <li v-for="value in 3">
                <a href="#" @click="jump(value)">{{ value }}</a>
            </li>
        </ul>
    </div>

    <script type="module">
        import { createApp, reactive, ref } from './vue.esm-browser.js'

        createApp({
            setup() {
                const number = ref(1)

                const prev = () => {
                    number.value--

                    if (number.value == 0) {
                        number.value = 3
                    } 
                }

                const next = () => {
                    number.value++

                    if (number.value == 4) {
                        number.value = 1
                    }
                }

                // 跳转
                const jump = (value) => {
                    number.value = value
                }

                return {
                    number,
                    next,
                    prev,
                    jump
                }
            }
            
        }).mount("#app")
    </script>
</body>
</html>

记事本案例

<!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>
<body>
    <div id="app">
        <input type="text" v-model="data.content">

        <button @click="add">添加</button>

        <ul>
            <li v-for="(value, index) in data.list">
                {{ value }}:
                <button @click="del(index)">删除</button>
            </li>
        </ul>

        <!-- 记事本长度 -->
        {{ data.list.length }}

        <!-- 清空记事本 -->
        <button @click="clear">清空</button>
    </div>

    <script type="module">
        import { createApp, reactive } from "./vue.esm-browser.js"

        createApp({
            setup() {
                const data = reactive({
                    content: 'www.zz.com',
                    list: ['zz学习', 'zz.cm']
                })

                const add = () => {
                    data.list.push(data.content)
                    console.log(data.list)
                }

                const del = (index) => {
                    data.list.splice(index, 1)
                }

                const clear = (index) => {
                    data.list = []
                }

                return {
                    data,
                    add,
                    del,
                    clear
                }
            }
        }).mount("#app")

    </script>
</body>
</html>

购物车案例

<!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: #F5F5F5;
        }

        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">
                    <!-- :value是当前对象数据,取消勾选就会从v-model绑定的数组中剔除 -->
                    <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'

        createApp({
            setup() {
                const data = reactive({
                    // 为true是全选;false为取消全选
                    selected: false,

                    // 存储选中的商品
                    checkboxList: [],
                    list: [
                        {
                            id: 1,
                            name: '铅笔',
                            price: 10,
                            number: 1,
                            stock: 3
                        },
                        {
                            id: 2,
                            name: '橡皮',
                            price: 5,
                            number: 2,
                            stock: 5
                        },
                        {
                            id: 3,
                            name: '钢笔',
                            price: 50,
                            number: 1,
                            stock: 6
                        },
                    ]
                })

                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
                    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,
                    sub, 
                    add,
                    del
                }
            }
        }).mount("#app")
    </script>
</body>
</html>

购物车优化案例

使用watch、computed进行优化。

<!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: #F5F5F5;
        }

        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"></td>
                    <td>商品</td>
                    <td>单价</td>
                    <td>库存</td>
                    <td colspan="2">操作</td>
                </tr>
            </thead>
            <tbody>
                <tr v-for="(value, index) in data.list">
                    <!-- :value是当前对象数据,取消勾选就会从v-model绑定的数组中剔除 -->
                    <td>
                        <input
                            type="checkbox"
                            :value="value"
                            v-model="data.checkboxList"
                        >
                    </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, watch, computed } from './vue.esm-browser.js'

        createApp({
            setup() {
                const data = reactive({
                    // 为true是全选;false为取消全选
                    selected: false,

                    // 存储选中的商品
                    checkboxList: [],
                    list: [
                        {
                            id: 1,
                            name: '铅笔',
                            price: 10,
                            number: 1,
                            stock: 3
                        },
                        {
                            id: 2,
                            name: '橡皮',
                            price: 5,
                            number: 2,
                            stock: 5
                        },
                        {
                            id: 3,
                            name: '钢笔',
                            price: 50,
                            number: 1,
                            stock: 6
                        },
                    ]
                })

                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
                }

                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, "oldValue: ", oldValue)
                    if (newValue.length == data.list.length && data.list.length != 0) {
                        data.selected = true
                        flag = true
                    } else {
                        data.selected = false
                        flag = false
                    }
                })

                // 总价格
                const totalPrice = computed(() => {
                    /**
                        reduce定义:用干对数组中的所有元素进行迭代操作,并将每次操作的结果累加到一个初始值上
                        reduce接收两个参数:一个是累加器函数,另一个是初始值
                        reduce:将 data.checkboxList 数组中的每个 checkbox 对象的 price 和 number 属性进行相乘,
                        并将结果累加到初始值 0 上,最后返回累加的结果

                        tota1(累加器)用干存储每次计算的结果,初始值为0
                        item(当前元素)在每次迭代过程中,当前元素的值会被传递给回调函数
                     */
                    return data.checkboxList.reduce((total, item) => total + item.price * item.number, 0)
                })

                return {
                    data,
                    totalPrice,
                    sub, 
                    add,
                    del
                }
            }
        }).mount("#app")
    </script>
</body>
</html>

使用Axios实现文章搜索案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="axios.min.js"></script>
</head>
<body>
    <div id="app">
        <select v-model="data.type">
            <option value="0">请选择</option>
            <option value="1">ID</option>
            <option value="2">标题</option>
        </select>

        <input type="text" v-model="data.content">
        <button @click="search">搜索</button>

        <br>
        <ul>
            <li v-for="(item, index) in data.list">
                {{ item }}
            </li>
        </ul>
    </div>

    <script type="module">
        import {createApp, reactive} from './vue.esm-browser.js'

        createApp({
            setup() {
                const data = reactive({
                    type: '0', // 搜索类型
                    content: "", // 搜索内容
                    list: []
                })

                // 搜索
                const search = () => {
                    data.list = []
                    console.log("搜索类型:", data.type, "搜索内容:", data.content)
                    if (data.type == '1') {
                        let id = data.content

                        // get请求
                        axios.get(`http://127.0.0.1/article/get/id/${id}`).then(response => {
                            console.log('get.data', response.data)
                            if (response.data.status == "success") {
                                if (response.data.data) {
                                    data.list.push(response.data.data)
                                }
                            }
                        }).catch(error => {
                            console.log("get.error", error)
                        }).finally(() => {
                            console.log('get.finally')
                        })
                    } else if (data.type == '2') {
                        let param = {
                            title: data.content
                        }
                        // post请求
                        axios.post(`http://127.0.0.1/article/postJson/search`, param).then(response => {
                            console.log('get.data', response.data)

                            if (response.data.status == "success") {
                                for(let i = 0; i < response.data.data.length; i++) {
                                    data.list.push(response.data.data[i])
                                    // push: 向数组末尾添加一个或多个元素
                                }
                            }
                        }).catch(error => {
                            console.log("get.error", error)
                        }).finally(() => {
                            console.log('get.finally')
                        })
                    }
                }

                return {
                    data,
                    search
                }
            }
        }).mount("#app")
    </script>
</body>
</html>

up主讲的太好啦!多练多练!!

相关文章:

  • 内存128mb做网站够吗seo公司网站
  • wordpress调用列表页灰色seo关键词排名
  • 成都网站建设与推广淘宝网站的推广与优化
  • 美食论坛网站模板大连seo顾问
  • wordpress代码执行seo怎么优化网站排名
  • 萧山网站优化河南企业站seo
  • 力扣 划分字母区间
  • linux有哪些常用命令?
  • 华为在不同发展时期的战略选择(节选)
  • 达梦数据库系列之安装及Mysql数据迁移
  • Spring 集成 MyBatis 操作指南(详细实例)
  • 数据结构:树的概念
  • React Router 完全指南:从基础到高级实践
  • 数据基础4: 线性代数基础行列式(矩阵)
  • ctfshow——域名TXT记录泄露
  • React状态管理进阶(四):从Redux到原子革命的终极指南
  • 基于django图书信息管理系统的搭建(增删改查)
  • MySQL系列之远程管理(安全)
  • 前端性能优化
  • 【Java】Tomcat日志
  • ERP系统的库存模块业务逻辑及设计
  • 剖析Kafka持久化底层原理
  • 使用 Kubeflow 和 Ray 构建机器学习平台
  • 使用Semantic Kernel:对DeepSeek添加自定义插件
  • 哈工大《计算机组成原理》第一章笔记
  • 网络参考模型(全)、ARP协议