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

Vue--组件练习案例

图片轮播案例:

 <!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>

记事本案例:

<!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)

<!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>

前端是练出来的!

相关文章:

  • 【ROS2】行为树 BehaviorTree(三):异步操作
  • 007.Gitlab CICD缓存与附件
  • 基于SSM框架的校园食堂小程序设计与实现
  • 基于springboot的“嗨玩旅游网站”的设计与实现(源码+数据库+文档+PPT)
  • # Unity动画控制核心:Animator状态机与C#脚本实战指南 (Day 29)
  • AT_abc400_e [ABC400E] Ringo‘s Favorite Numbers 3 题解
  • VR 全景多维赋能,众趣科技助力零售业开启购物新时代
  • C++学习之外联接口-项目总结
  • sqlmap使用tamper解决过滤waf问题 实战解决[极客大挑战 2019]BabySQL 1
  • 第十九讲 | XGBoost 与集成学习:精准高效的地学建模新范式
  • daz dForce to UE 的原理分析
  • 网络6 配置静态地址 路由表
  • RAG(检索增强生成)学习路径全解析:从入门到精通
  • 【AI提示词】网络安全专家
  • 神经子图同构计数
  • 如何通过自动化解决方案提升企业运营效率?
  • 鸿蒙开发-页面跳转
  • linux命令之tee(Linux Command Tee)
  • Javaweb后端 maven高级 maven聚合
  • GESP2023年12月认证C++七级( 第二部分判断题(1-5))
  • AI含量非常高,2025上海教育博览会将于本周五开幕
  • 广东省原省长卢瑞华逝世,享年88岁
  • 宝通科技:与宇树合作已签约,四足机器人在工业场景落地是重点商业化项目
  • 王毅人民日报撰文:共商发展振兴,共建中拉命运共同体
  • 金价大跌!足金饰品每克一夜便宜14元,涨势是否已终结?
  • 27岁杨阳拟任苏木镇党委副职,系2020年内蒙古自治区选调生