Vue及自定义组件完成10×10图片表格的点击效果

该示例展示了如何利用Vue.js创建一个自定义组件,实现弹性布局下的图片展示。每个图片块可以通过点击事件切换显示状态,通过v-show控制图片的隐藏和显示。布局部分使用了CSS的flexbox,Vue实例中定义了图片数组并进行循环渲染。
摘要由CSDN通过智能技术生成

全部代码

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <style type="text/css">
            body {
                background-color: green
            }

            .content {
                width: 1920px;
                border: 1px solid red;
                margin: 0 auto;
                /*弹性布局*/
                display: flex;
                /*在住轴上的对齐方式*/
                justify-content: space-around;
                /*是否换行*/
                flex-wrap: wrap;
            }

            .item {
                width: 189px;
                height: 142px;
                margin: 3px 1px;
                background-color: #FF0000
            }
            img{
                width: 189px;
                height: 142px;
            }
        </style>
        <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
        <div id="app">

            <div class="content">
                <test-div v-for="i in imgs" :im="i"></test-div>

            </div>

        </div>
        <template id="fu-temp">
            <div class="item" @click="change">
                <img :src="im" v-show="show" />
            </div>
        </template>
        <script>
            Vue.component("test-div", {
                template: '#fu-temp',
                props: ["im"],
                data: function() {
                    return {
                        show: true,
                        img: "img/12346_01.gif"
                    }
                },
                methods: {
                    change: function() {
                        this.show = !this.show
                    }
                }
            });
            var vm = new Vue({
                el: "#app",
                data: {
                    imgs: ["img/12346_01.gif", "img/12346_02.gif", "img/12346_03.gif", "img/12346_04.gif", "img/12346_05.gif",
                        "img/12346_06.gif", "img/12346_07.gif", "img/12346_08.gif", "img/12346_09.gif",
                        "img/12346_10.gif", "img/12346_11.gif", "img/12346_12.gif", "img/12346_13.gif",
                        "img/12346_14.gif", "img/12346_15.gif", "img/12346_16.gif", "img/12346_17.gif",
                        "img/12346_18.gif", "img/12346_19.gif", "img/12346_20.gif", "img/12346_21.gif",
                        "img/12346_22.gif", "img/12346_23.gif", "img/12346_24.gif", "img/12346_25.gif",
                        "img/12346_26.gif", "img/12346_27.gif", "img/12346_28.gif", "img/12346_29.gif",
                        "img/12346_30.gif", "img/12346_31.gif", "img/12346_32.gif", "img/12346_33.gif",
                        "img/12346_34.gif", "img/12346_35.gif", "img/12346_36.gif", "img/12346_37.gif",
                        "img/12346_38.gif", "img/12346_39.gif", "img/12346_40.gif", "img/12346_41.gif",
                        "img/12346_42.gif", "img/12346_43.gif", "img/12346_44.gif", "img/12346_45.gif",
                        "img/12346_46.gif", "img/12346_47.gif", "img/12346_48.gif", "img/12346_49.gif",
                        "img/12346_50.gif", "img/12346_51.gif", "img/12346_52.gif", "img/12346_53.gif",
                        "img/12346_54.gif", "img/12346_55.gif", "img/12346_56.gif", "img/12346_57.gif",
                        "img/12346_58.gif", "img/12346_59.gif", "img/12346_60.gif", "img/12346_61.gif",
                        "img/12346_62.gif", "img/12346_63.gif", "img/12346_64.gif", "img/12346_65.gif",
                        "img/12346_66.gif", "img/12346_67.gif", "img/12346_68.gif", "img/12346_69.gif",
                        "img/12346_70.gif", "img/12346_71.gif", "img/12346_72.gif", "img/12346_73.gif",
                        "img/12346_74.gif", "img/12346_75.gif", "img/12346_76.gif", "img/12346_77.gif",
                        "img/12346_78.gif", "img/12346_79.gif", "img/12346_80.gif", "img/12346_81.gif",
                        "img/12346_82.gif", "img/12346_83.gif", "img/12346_84.gif", "img/12346_85.gif",
                        "img/12346_86.gif", "img/12346_87.gif", "img/12346_88.gif", "img/12346_89.gif",
                        "img/12346_90.gif", "img/12346_91.gif", "img/12346_92.gif", "img/12346_93.gif",
                        "img/12346_94.gif", "img/12346_95.gif", "img/12346_96.gif", "img/12346_97.gif",
                        "img/12346_98.gif", "img/12346_99.gif", "img/12346_100.gif"
                    ]

                }
            })
        </script>

    </body>
</html>

效果图

未点击状态

点击状态

  • 找出你想用的图片,将它切成任意等分,我这里切成了10*10等分(切图建议使用ps工具)

  • 也可以使用文章中的图片点我

首先我们引入Vue.js

<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>

布局部分

布局方面我们创建两个div,和一个自定义组件

imgs代表循环次数后面我们

<div id="app">

            <div class="content">
                <test-div v-for="i in imgs" :im="i"></test-div>

            </div>

        </div>

css部分,布局方面我们使用弹性布局,并设置换行

<style type="text/css">
            body {
                background-color: green
            }

            .content {
                width: 1920px;
                border: 1px solid red;
                margin: 0 auto;
                /*弹性布局*/
                display: flex;
                /*在住轴上的对齐方式*/
                justify-content: space-around;
                /*是否换行*/
                flex-wrap: wrap;
            }

            .item {
                width: 189px;
                height: 142px;
                margin: 3px 1px;
                background-color: #FF0000
            }
            img{
                width: 189px;
                height: 142px;
            }
        </style>

自定义组件的使用

1.@click:完成盒子点击事件的效果

2.v-show:实现点击盒子进行show的取反

<template id="fu-temp">
            <div class="item" @click="change">
                <img :src="im" v-show="show" />
            </div>
        </template>

Vue部分

自定义组件

1.props:自定义属性

2.data:图片的地址和显示

3.methods:此方法为点击盒子进行show的取反,实现隐藏图片的效果

4.template:定义组件长什么样子

Vue.component("test-div", {
                template: '#fu-temp',
                props: ["im"],
                data: function() {
                    return {
                        show: true,
                        img: "img/12346_01.gif"
                    }
                },
                methods: {
                    change: function() {
                        this.show = !this.show
                    }
                }
            });

Vue实例化

1.el:作用范围

2.data:定义一个储存路径的数组

3.imgs里面放几张图就循环几次

var vm = new Vue({
                el: "#app",
                data: {
                    imgs: ["img/12346_01.gif", "img/12346_02.gif", "img/12346_03.gif", "img/12346_04.gif", "img/12346_05.gif",
                        "img/12346_06.gif", "img/12346_07.gif", "img/12346_08.gif", "img/12346_09.gif",
                        "img/12346_10.gif", "img/12346_11.gif", "img/12346_12.gif", "img/12346_13.gif",
                        "img/12346_14.gif", "img/12346_15.gif", "img/12346_16.gif", "img/12346_17.gif",
                        "img/12346_18.gif", "img/12346_19.gif", "img/12346_20.gif", "img/12346_21.gif",
                        "img/12346_22.gif", "img/12346_23.gif", "img/12346_24.gif", "img/12346_25.gif",
                        "img/12346_26.gif", "img/12346_27.gif", "img/12346_28.gif", "img/12346_29.gif",
                        "img/12346_30.gif", "img/12346_31.gif", "img/12346_32.gif", "img/12346_33.gif",
                        "img/12346_34.gif", "img/12346_35.gif", "img/12346_36.gif", "img/12346_37.gif",
                        "img/12346_38.gif", "img/12346_39.gif", "img/12346_40.gif", "img/12346_41.gif",
                        "img/12346_42.gif", "img/12346_43.gif", "img/12346_44.gif", "img/12346_45.gif",
                        "img/12346_46.gif", "img/12346_47.gif", "img/12346_48.gif", "img/12346_49.gif",
                        "img/12346_50.gif", "img/12346_51.gif", "img/12346_52.gif", "img/12346_53.gif",
                        "img/12346_54.gif", "img/12346_55.gif", "img/12346_56.gif", "img/12346_57.gif",
                        "img/12346_58.gif", "img/12346_59.gif", "img/12346_60.gif", "img/12346_61.gif",
                        "img/12346_62.gif", "img/12346_63.gif", "img/12346_64.gif", "img/12346_65.gif",
                        "img/12346_66.gif", "img/12346_67.gif", "img/12346_68.gif", "img/12346_69.gif",
                        "img/12346_70.gif", "img/12346_71.gif", "img/12346_72.gif", "img/12346_73.gif",
                        "img/12346_74.gif", "img/12346_75.gif", "img/12346_76.gif", "img/12346_77.gif",
                        "img/12346_78.gif", "img/12346_79.gif", "img/12346_80.gif", "img/12346_81.gif",
                        "img/12346_82.gif", "img/12346_83.gif", "img/12346_84.gif", "img/12346_85.gif",
                        "img/12346_86.gif", "img/12346_87.gif", "img/12346_88.gif", "img/12346_89.gif",
                        "img/12346_90.gif", "img/12346_91.gif", "img/12346_92.gif", "img/12346_93.gif",
                        "img/12346_94.gif", "img/12346_95.gif", "img/12346_96.gif", "img/12346_97.gif",
                        "img/12346_98.gif", "img/12346_99.gif", "img/12346_100.gif"
                    ]

                }
            })

好的到这里我们的项目算是完成了,祝大家生活愉快!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,下面是一个简单的示例代码,可以帮助你自定义一个表格组件: ```vue <template> <table> <thead> <tr> <th v-for="header in headers" :key="header">{{ header }}</th> </tr> </thead> <tbody> <tr v-for="(row, index) in rows" :key="index"> <td v-for="(item, key) in row" :key="key">{{ item }}</td> </tr> </tbody> </table> </template> <script> export default { props: { headers: { type: Array, required: true }, rows: { type: Array, required: true } } } </script> ``` 在这个组件中,我们使用了两个 props:headers 和 rows。headers 表示表格的表头,是一个字符串数组;rows 表示表格的数据行,是一个对象数组。在组件的模板中,我们使用了 v-for 指令来渲染表头和数据行。在表头中,我们使用了 v-for 和 :key 指令来循环渲染表头中的每一个单元格。在数据行中,我们使用了 v-for 和 :key 指令来循环渲染每一行中的每一个单元格。 你可以在父组件中使用这个组件来渲染一个自定义表格: ```vue <template> <div> <my-table :headers="headers" :rows="rows"></my-table> </div> </template> <script> import MyTable from './MyTable.vue' export default { components: { MyTable }, data () { return { headers: ['Name', 'Age', 'Gender'], rows: [ { name: 'Alice', age: 25, gender: 'Female' }, { name: 'Bob', age: 30, gender: 'Male' }, { name: 'Charlie', age: 20, gender: 'Male' } ] } } } </script> ``` 在这个父组件中,我们通过调用 MyTable 组件,并传入 headers 和 rows 两个 props 来渲染一个自定义表格。注意,父组件中的数据格式必须符合 MyTable 组件 props 的要求,即 headers 必须是一个字符串数组,rows 必须是一个对象数组。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值