Vue--组件练习案例

图片轮播案例:

html 复制代码
 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>Title</title>
 </head>
 <body>
 <!--轮播图片-->
 <div id="app">
     <h1>轮播图</h1>
     <button @click="last">上一张</button>
     <img :src=`./img/${number}.jpg` style="height: 10%" width="10%">
     <button @click="next">下一张</button>
     <hr>
     <ul>
         <li v-for="value in 5">
             <a href="#" @click="jump(value)">{{value}}</a>
         </li>
     </ul>
 </div>
 <script type="module">
     import {createApp,ref,reactive} from './vue.esm-browser.js'
     createApp({
         setup(){
             const number = ref(1)
             const next = () =>{
                 number.value++
                 if(number.value>5){
                     number.value=1
                 }
             }
             const last = () =>{
                 number.value--
                 if(number.value<1){
                     number.value=5
                 }
             }
             const jump = (index) =>{
                 number.value = index
             }
             return{
                 number,
                 next,
                 last,
                 jump
             }
         }
     }).mount('#app')
 </script>
 </body>
 </html>

记事本案例:

html 复制代码
<!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>Title</title>
 </head>
 <body>
 <div id="app">
     <input type="text" v-model="data.content">
     <button @click="add">添加</button><p/>
 ​
     <ul>
         <li v-for="(item,index) in data.list" :key="index">
             {{item}}
             <button @click="update(index)">修改</button>
             <button @click="del(index)">删除</button>
         </li>
     </ul>
     <hr>
     {{data.list.length}}
     <button @click="clear">清空</button>
 </div>
 ​
 <script type="module">
     import {createApp,ref,reactive} from '../js/vue.esm-browser.js'
     createApp({
         setup(){
             const data = reactive({
                 content:"https://blog.csdn.net/m0_73856804?spm=1010.2135.3001.5343",
                 list:["麓殇","https://blog.csdn.net/m0_73856804?spm=1010.2135.3001.5343"]
             })
             // 添加数据
             const add = () =>{
                 data.list.push(data.content)
                 console.log(data.list)
             }
             //删除数据
             const del = (index) =>{
                 data.list.splice(index,1)
                 console.log(data.list)
             }
             //修改数据
             const update = (index) =>{
                  data.content = data.list[index]
                 console.log(data.list)
             }
             //清空数据
             const clear = () =>{
                 data.list = []
                 console.log(data.list)
             }
             // 获取数据的数量
             return{
                 data,
                 add,
                 del,
                 clear,
                 update
             }
         }
     }).mount('#app')
 </script>
 </body>
 </html>

购物车案例(watch,computed)

html 复制代码
<!DOCTYPE html>
<html lang="en" xmlns:v-model="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>购物车</title>
</head>
<style>
    table{
        width: 600px;
        border: 1px solid #c8baba;
        text-align: center;
        border-collapse: collapse;

    }
    table thead{
        background: #756161;
        border: 1px solid #c8baba;
    }
    table tbody tr{
        border: 1px solid #c8baba;
        height: 30px;
        line-height: 30px;
        background: #a56d6d;
    }
</style>
<body>

<div id="app">
    <table>
        <thead>
        <tr>
            <th><input type="checkbox" v-model="data.selected" ></th>
            <th>商品名称</th>
            <th>商品价格</th>
            <th>商品库存</th>
            <th colspan="2">操作</th>
        </tr>
        </thead>
        <tbody>
        <tr v-for="(item,index) in data.goods">
        <td><input type="checkbox" :value="item.id" v-model="data.checkboxlist" ></td>
            <td>{{item.name}}</td>
            <td>{{item.price}}</td>
            <td>{{item.stock}}</td>
            <td>
                <button @click="sub(item)">-</button>
                {{item.count}}
                <button @click="add(item)">+</button>
            </td>
            <td>
                <button @click="del(index,item.id)">删除</button>
            </td>
        </tr>
        </tbody>
        <tfoot>
        <tr>
            <td colspan="3">
               总价:{{totalPrice}}
            </td>
        </tr>
        </tfoot>
    </table>
</div>
<!--@change:change事件是在元素的值发生改变的时候会触发的事件,我们可以通过该事件实现商品的全选和取消全选-->
<script type="module">
    import {createApp,reactive,watch,computed} from '../js/vue.esm-browser.js'
    createApp({
        setup() {
            const data = reactive({
                checkboxlist:[],//存储购物车中的选中的商品
                selected: false,//全选按钮是否被选中
                goods: [
                    {
                        id: 1,
                        name: '华为手机',
                        price: 4000,
                        count: 100,
                        stock: 200
                    },
                    {
                        id: 2,
                        name: '小米手机',
                        price: 2600,
                        count: 100,
                        stock: 200
                    },
                    {
                        id: 3,
                        name: '三星手机',
                        price: 8000,
                        count: 100,
                        stock: 200
                    },
                    {
                        id: 4,
                        name: '荣耀手机',
                        price: 7000,
                        count: 100,
                        stock: 200
                    }
                ],

            })
            const totalPrice = computed(() => {
                let total = 0
                //reduce定义:用于数组中的所有元素进行迭代操作,并将每一次操作的结果累加在一个初始值上
                //reduce接受两个参数:一个是累加函数,一个是初始值
                //reduce:将data.checkboxList数组中的每个对象的price和count相乘,将结果累加在初始值 0 上,最后返回结果
                // const item1 = data.goods.find(good => good.id === data.checkboxlist[i])
                for (let i = 0; i < data.checkboxlist.length; i++) {
                            const item = data.goods.find(good => good.id === data.checkboxlist[i])
                             if (item) {
                                 total += item.price * item.count
                             }
                         }
                         return total
            })
            const add = (item) => {
                if (item.count < item.stock) {
                    item.count++
                    item.stock--
                }
            }
            const sub = (item) => {
                if (item.count > 1) {
                    item.count--
                    item.stock++
                }
            }
            let flag = true
            watch(() =>data.selected,(newValue,oldValue)=>{
                console.log(newValue,oldValue)
                if (newValue) {
                    data.checkboxlist = data.goods.map(item => item.id)
                }else {
                    if (flag){
                        data.checkboxlist = []
                    }
                }
            })
            watch(()=>data.checkboxlist,(newValue,oldValue)=>{
                if (newValue.length === data.goods.length && newValue.length !== 0){
                    data.selected = true
                    flag = true
                }else{
                    data.selected = false
                    flag = false
                }


            })
                const del = (index,id) => {
                    data.goods.splice(index,1)
                    let newArr = data.checkboxlist.filter((item,index) =>{
                        return item.id !== id
                    })
                    data.checkboxlist = newArr
                }
            return {
                data,
                totalPrice,
                add,
                del,
                sub,
            }
        }
    }).mount('#app')
</script>
</body>
</html>

前端是练出来的!

相关推荐
子兮曰1 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰1 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万1 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝1 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
A黄俊辉A1 天前
uniapp webview中实现 app和内嵌的H5双向通信
vue.js·json
三十而立洋1 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁1 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄1 天前
JavaScript 隐式全局变量解析
javascript
honkun61 天前
vue 表格组件 vxe-table 配置 ajax 请求自动加载数据与表单查询
vue.js·vxe-table
kybs19911 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net