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

前端框架Vue3项目实战(基于Vue3实现一个小相册)

下面是是对Vue3操作的一个项目实战

下面代码是html的基本骨架(没有任何的功能):

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>相册</title>

    <style>

        .box{

            margin-bottom: 20px;

            padding: 0;

        }

        .img{

            width: 480px;  

            height: 240px;

            border: 1px bisque solid;

        }

    </style>

</head>

<body>

    <div id="app">

        <h2>基于Vue3实现的相册:展示第xx张相片</h2>      

        <img src = "./img_src/logo1.png" class="img" alt="图片加载失败">

        <ul type="none" class="box"></ul>       

        <button>上一张</button>   <button>下一张</button>

    </div>

    <script type="module">

        import { createApp, ref } from './vue.esm-browser.js'

    </script>

</body>

</html>

运行结果:

                ​​​​​​​        ​​​​​​​        ​​​​​​​         

接下来我们将添加代码使其变成一个小相册,运行结果如下图:

         

我们可以点击上一张或下一张来实现图片的跳转,也可以使用按钮1234来实现你想跳转的张数

【实现思路】

1. 利用v-on为切换相片的按钮绑定上一个函数,这个函数负责更改图片路径

2. 利用v-bind绑定图片的路径,使得图片路径可以自动更新

 以下是实现相册的完整代码:

(注:红色代码为上述代码的添加或修改)

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>相册</title>

    <style>

        .clear_ele::after{

            content: "";  /* 这个伪元素的内容属性必须有 */

            display: block;

            clear: both;

        }

        .box{

            margin-bottom: 20px;

            padding: 0;

        }

        .button{

            background-color: bisque;

            width: 20px;

            float: left;  

            text-align: center;

            margin-right: 10px;

            border-radius: 8px;

            cursor: pointer;  

        }

        .img{

            width: 480px;  

            height: 240px;

            border: 1px bisque solid;

        }

    </style>

</head>

<body>

    <div id="app">

        <h2>基于Vue3实现的相册:展示第{{ img.number }}张相片</h2>       

        <img v-bind:src="img.url"   class="img">

        <ul type="none" class="clear_ele box">

            <li v-for="(val, idx) in 4"  @click="jump(val)" class="button"> {{val}} </li>

        </ul>

        <button @click="prev">上一张</button>     <button @click="next">下一张</button>

    </div>

    <script type="module">

        import { createApp,  ref,  reactive } from './vue.esm-browser.js'

        createApp({

            setup() {

                // 【定义数据】

                const img = reactive(

                    {

                        number: 1,

                        url: "./img_src/logo1.png"

                    }

                )

                // 【定义函数】

                //上一张

                const prev = () => {

                    img.number--

                    if (img.number == 0) {

                        img.number = 4

                    }

                    img.url = `./img_src/logo${img.number}.png`                

                }        

       

                //下一张

                const next = () => {

                    img.number++

                    if (img.number == 5) {

                        img.number = 1

                    }

                    img.url = `./img_src/logo${img.number}.png`

                }

                //跳转

                const jump = (val) => {

                    img.number = val

                    img.url = `./img_src/logo${img.number}.png`

                }

                return {img, prev,next,jump}

            }

        }).mount("#app")

    </script>

</body>

</html>

 还有另一种方法也同样可以实现相册的效果,代码如下:

下述代码的弊端就是比较冗长,相对于上一种方法会消耗更长时间,因为它是把每一张照片的使用结果一一敲出来的,可与上面代码比对

(注:橙色代码为最开始代码的添加或修改)

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>相册</title>

    <style>

        .clear_ele::after{

            content: "";  /* 这个伪元素的内容属性必须有 */

            display: block;

            clear: both;  /* 忽略前面盒子浮动带来的影响,解决父盒高度塌陷问题 */

        }

        .button{

            background-color: bisque;

            width: 20px;

            float: left;  

            text-align: center;

            margin-right: 10px;

            border-radius: 8px;

            cursor: pointer;  

        }

        .img{

            width: 480px;  

            height: 240px;

            border: 1px bisque solid;

        }

        .box{

            margin-bottom: 20px;

            padding: 0;

        }

    </style>

</head>

<body>

    <div id="app">

        <h2>基于Vue3实现的相册:展示第{{img.index}}张相片</h2>       

        <img v-bind:src= "img.url" class="img" alt="图片加载失败">

        <ul type="none" class="box clear_ele">

            <li class="button" v-on:click = "show_1_img">1</li>

            <li class="button" v-on:click = "show_2_img">2</li>

            <li class="button" v-on:click = "show_3_img">3</li>

            <li class="button" v-on:click = "show_4_img">4</li>

        </ul>     

        <button v-on:click = "pre">上一张</button>  

        <button v-on:click = "next">下一张</button>

    </div>

    <script type="module">

        import { createApp, reactive } from './vue.esm-browser.js'

        createApp({

            setup() {

                const img = reactive(

                    {

                     

                      index: 1,

                      url:  "./img_src/logo1.png",  //图片路径

                    }  

                )

                const show_1_img = () => {

                    img.index = 1

                    img.url = `./img_src/logo${img.index}.png`

                    console.log(`用户点击第${img.index}张按钮,显示第${img.index}张照片`);

                }

                const show_2_img = () => {

                    img.index = 2

                    img.url = `./img_src/logo${img.index}.png`

                    console.log(`用户点击第${img.index}张按钮,显示第${img.index}张照片`);

                }

                const show_3_img = () => {

                    img.index = 3

                    img.url = `./img_src/logo${img.index}.png`

                    console.log(`用户点击第${img.index}张按钮,显示第${img.index}张照片`);

                }

                const show_4_img = () => {

                    img.index = 4

                    img.url = `./img_src/logo${img.index}.png`

                    console.log(`用户点击第${img.index}张按钮,显示第${img.index}张照片`);

                }            

                const pre = () => {

                    img.index = img.index - 1

                    if(img.index < 1 ){

                        img.index = 4

                    }

                    // 把图片路径存储在响应式数据里,当这个响应式数据改变时,html的图片路径就会自动改变

                    img.url = `./img_src/logo${img.index}.png`

                    console.log(`用户点击了上一张按钮,显示第${img.index}张照片`);

                }

                const next = () => {

                    img.index = img.index + 1

                    if(img.index > 4 ){  // 图片展示完了,回到第一张

                        img.index = 1

                    }

                    // 把图片路径存储在响应式数据里,当这个响应式数据改变时,html的图片路径就会自动改变

                    img.url = `./img_src/logo${img.index}.png`

                    console.log(`用户点击了下一张按钮,显示第${img.index}张照片`);

                }              

                return { img,

                    show_1_img,

                    show_2_img,

                    show_3_img,

                    show_4_img,

                    pre, next }   //把数据(属性), 函数(方法)暴露出来,供HTML模板调用

            }

        }).mount("#app")

    </script>

</body>

</html>


http://www.kler.cn/a/417179.html

相关文章:

  • go结构体详解
  • Qt实现简易视频播放器
  • 计算 MySQL 表行的成本是多少?
  • docker多个容器的相互通信
  • 杭州某小厂面试
  • 括号生成(回溯法详解)
  • spring boot打包fat jar
  • jvm-48-java 变更导致压测应用性能下降,如何分析定位原因?
  • 洛谷 B3626 跳跃机器人 C语言 记忆化搜索
  • 宠物领养技术的SpringBoot革新
  • FFmpeg 的 codec 和 format
  • Android opengl 绘制矩形,宽高相同,不能显示为正方形,是怎么回事
  • maven <scope>compile</scope>作用
  • 关于函数式接口和编程的解析和案例实战
  • LeetCode 热题 100_轮转数组(15_189_中等_C++)(额外数组;翻转)(void函数使用return)
  • 前端开发常用快捷键
  • AtomicIntegerFieldUpdater能否降低内存
  • HTTP 探秘之旅:从入门到未来
  • 什么是 JVM?它的主要作用是什么?
  • 【海底地震仪】的发展越来越趋向于智能化、自主化、多功能化、小型化和便携化
  • vue实现弹窗输入验证码
  • 热门金融大模型整理
  • linux tcpdump编译
  • 【NOIP提高组】回文数
  • pnpm.lock.yaml,到底是干什么的?
  • 详解PyTorch中的Sequential容器:构建与优化简单卷积神经网络