6.3 组件设计:框架GameFrame

GameFrame是指包含若干个游戏的小框架,里面的游戏都属于同一个类型,例如角色扮演、回合制,下面来创建这个组件,在src/components文件夹下创建GameFrame.vue,它的template部分如下:
<template>
    <div>
        <div class="gameFrameName">
            <span>仙侠</span>
            <a href="search.jsp?gametype=角色">更多</a>
        </div>
        <div class="game_list_div">
            <div class="game_content">
                <!-- 上一节的Game组件 -->
                <block v-for="game in games" :key="game">
                  <Game :game="game"/>
                </block>
            </div>
        </div>
    </div>
</template>
由于使用了组件,那么GameFrame的script部分,应该是这样:
import Game from "@/components/Game.vue";
export default{
    name:"GameFrame",
    data(){
        return{
            games:[1,2,3]//GameFrame内部包含的所有游戏,在GameFrame内部查询
        }
    },
    components:{
        Game
    },
}
然后绑定路由/gameframe,访问后效果图如下:
出现了三个同样的游戏,是因为games里面有三个元素[1,2,3],template的第10行到12行就是去循环这个games变量,第11行的game组件就被显示了三次。
到了这里,应该可以发现,Game的数据,是GameFrame提供的,接下来,把games的[1,2,3]替换成下面的游戏数据:
games:[{
            "name""苍穹之剑",
            "url""https://pkg.d.cn/ios/109840/736_1.html?vc=8d6e14d20d04da65be067e2fe805e0d0",
            "platform""ios",
            "iconUrl""https://res5.d.cn/cp/img/967/o_1b6as875710i1ocu2ka76n1i013.png",
            "guildFirstDiscount""0.50",
            "guildNormalDiscount""0.54",
            "intro""《苍穹之剑2》由《苍穹之剑》原班人马打造的影漫游联动的跨界IP巨制",
            "id""2529",
            "appid""736",
            "lastUpgradeTime""",
            "upgradeStatus": null,
            "latestVersion""2.0.21",
            "channelVersion": null,
            "packName": null,
            "firstDiscount""0.50",
            "discount""0.50",
            "level""1",
            "datetime""2025-02-24 14:19:55",
            "lowestDiscount""0.51",
            "channel""当乐",
            "gameUrl""http://3g.d.cn/cangqiongzhijianer/",
            "img""http://res5.d.cn/cp/img/503824/o_1c7vefcv1b0m1ruu96do9c1mgr13_0.6.jpg@http://res5.d.cn/cp/img/503824/o_1c7vefcv15fgh4s1je119le14j14_0.6.jpg@http://res5.d.cn/cp/img/503824/o_1c7vefcv1r1u1q151t4r66e7at15_0.6.jpg@http://res5.d.cn/cp/img/503824/o_1c7vefcv11gm9b5nf591n2d7n616_0.6.jpg@http://res5.d.cn/cp/img/503824/o_1c7vefcv0nu4sb1f6et84lh12_0.6.jpg",
            "type""角色 仙侠 动作",
            "description""《苍穹之剑2》由《苍穹之剑》原班人马打造的影漫游联动的跨界IP巨制。游戏以上古封魔之战为故事背景,谱写了一曲孙少云和恋人素雪跨越千年的爱情悲歌。游戏独创星座情缘、仙盟联赛、大逃杀、载具攻城战等核心玩法,告别枯燥无趣的日常,打造沉浸式场景交互,多维度社交体验,让我们一同开启属于你的苍穹世界!"
        },
        {
            "name""仙魔战场",
            "url""https://pkg.d.cn/pSCcJ2kQ",
            "platform""android",
            "iconUrl""https://img.d.cn/cp_admin/icon/507393/13f96ac59b867ec34e68bf5f1a714d4f.png",
            "guildFirstDiscount""0.40",
            "guildNormalDiscount""0.42",
            "intro""《仙魔战场》3DARPG唯美画风、根据影视三生三世十里桃花剧情为蓝本",
            "id""10548",
            "appid""11996",
            "lastUpgradeTime""2024-11-04 23:06",
            "upgradeStatus": null,
            "latestVersion""1.0.0",
            "channelVersion": null,
            "packName": null,
            "firstDiscount""0.35",
            "discount""0.38",
            "level""2",
            "datetime""2025-02-24 14:17:57",
            "lowestDiscount""0.40",
            "channel""当乐",
            "gameUrl""https://3g.d.cn/xianmozhanchang/",
            "img""https://img.d.cn/cp_admin/icon/507393/07ea5b5f147e8bd862f1b7d93067e7f9_0.6.jpg@https://img.d.cn/cp_admin/icon/507393/b5923cbc4aa6b38dbeb1837a70ace4bf_0.6.jpg@https://img.d.cn/cp_admin/icon/507393/d04a4b3e20e3610e2555af5f7b4bdba4_0.6.jpg@https://img.d.cn/cp_admin/icon/507393/4637cd84bf1156d9a0455725d44e7d97_0.6.jpg@https://img.d.cn/cp_admin/icon/507393/e9ed53bccf5d1f0ce95118502b0af797_0.6.jpg",
            "type""角色 3D 仙侠",
            "description""《仙魔战场》3DARPG唯美画风、根据影视三生三世十里桃花剧情为蓝本,深度还原人物形象及剧情,给玩家提供最优质的虐恋沉浸剧情。更激爽的战斗体验,更炫酷的技能招数,更重于虐心剧情,重现最激爽的3D无锁定战斗,给你畅快的指尖战斗体验!。"
        },
        {
            "name""六界仙尊",
            "url""https://pkg.d.cn/oQFc2KEk",
            "platform""android",
            "iconUrl""https://img.d.cn/cp_admin/icon/507324/5cc0ae203d4982397b2039937159291c.png",
            "guildFirstDiscount""0.40",
            "guildNormalDiscount""0.40",
            "intro""六界仙尊正统续作《六界仙尊》强势来袭",
            "id""10549",
            "appid""11948",
            "lastUpgradeTime""2024-11-04 23:02",
            "upgradeStatus": null,
            "latestVersion""1.0.0",
            "channelVersion": null,
            "packName": null,
            "firstDiscount""0.28",
            "discount""0.31",
            "level""2",
            "datetime""2025-02-24 14:17:56",
            "lowestDiscount""0.40",
            "channel""当乐",
            "gameUrl""https://3g.d.cn/liujiexianzun/",
            "img""https://img.d.cn/cp_admin/icon/507324/2b20592ff958acc27019f55b1c16051d.png@https://img.d.cn/cp_admin/icon/507324/cf7337365a78b901c2a200e9af7260a8.png@https://img.d.cn/cp_admin/icon/507324/3e27f1cb86b678fefe7ee5a0925b84f2.png@https://img.d.cn/cp_admin/icon/507324/0501bed1e80d62444e757d5833d72aed.png@https://img.d.cn/cp_admin/icon/507324/73cd3a03fc3262db4c44bf5b988d8669.png",
            "type""角色 仙侠 动作",
            "description""六界仙尊正统续作《六界仙尊》强势来袭。天穹碎,六界风云起,凡界苦不聊生,补天之计迫在眉睫,修仙少女将陪伴你一起踏上修仙补天之路。至高挂机养成乐趣,竞技休闲不落下,更有十大神器助你傲视六界。Q萌到底的游戏画面,换不完的多样时装,多角色系统让你修仙路上不再孤单。定六界,救苍生,少侠还在等什么?"
        },]
保存后页面仍然显示那三个游戏,是因为game.vue组件里面的数据是固定的,下面来修改一下Game.vue的template部分,把里面所有固定的数据,用上面的json对于的属性代替,例如“三国杀”,就替换成{{game.name}}。注意,game是Game.vue组件的一个属性,它的值是外部指定的(现在知道就是GameFrame.vue指定的)。修改完Game.vue之后,就再也不能用/game访问了,因为game内部的数据为空。
<template>
    <div class="game_list" style="clear: both;">
        <div class="item_img" onclick="gameDetail('3768')">
            <img class="gameIcon" src="https://img.d.cn/cp_admin/icon/4484/be140cf3191820d73b15bd6e2119cc38.png">
        </div>
        <div class="item_content" onclick="gameDetail('3768')">
            <span class="game_channel">(当乐)</span>
            <span class="game_name">三国杀<span style="color: red">5.0</span>
            <span class="discount"></span>
            </span>
            <span class="intro">应用描述:《三国杀》2020年十佳卡牌游戏《三国杀》</span>
        </div>
        <div class="item_download">
            <span class="dow">下载地址:</span>
            <img class="platformicon" onclick="download(this)" data-url="https://pkg.d.cn/7NN1DPaO" src="https://www.codessp.cn/wxImage/android.png">
        </div>
    </div>
</template>
修改完毕后再访问/gameframe应该可以看到三个完全不同的游戏,也就是GameFrame里面
如果要展现动态的游戏,需要发起http请求查询。
接口如下:
请求方式:get
返回值:查找的游戏
type=仙侠表示查询仙侠游戏,num=10表示查询10个游戏,返回的json数据如下:
后面的几个Object就是剩余的9个游戏。如果吧请求url里面的仙侠改成回合、动漫这些,就会呈现此类型的游戏。
现在,我们只需要把返回的data值赋给games,那么/gameframe就能显示10个仙侠游戏了:

游戏是横向排列的,如果是纵向排列,那么只需要修改两个地方,第一个是Game.vue的第二行代码:
<div class="game_list" style="clear: both;">
改成:
<div class="game_item" style="clear: both;">
然后是gameFrame.vue的第七行代码:
<div class="game_list_div">
改成
<div class="">
现在看看效果图(需要在浏览器按下F12,切换成手机模式):
原来主页里面游戏横着和竖着显示,都是同一个组件Game,仅仅是css不一样。为了能动态让一些游戏横着排列,一些竖着排列,Game组件需要再接收一个属性,到底是game_list(横排)还是game_item(竖排)
而这个css数据,需要外部指定,于是gameFrame.vue的template部分变成了这样,第11行Game组件添加了css属性:
<template>
    <div>
        <div class="gameFrameName">
            <span>仙侠</span>
            <a href="search.jsp?gametype=角色">更多</a>
        </div>
        <div class="game_list_div">
            <div class="game_content">
                <!-- 上一节的Game组件 -->
                <block v-for="game in games" :key="game">
                  <Game :game="game" :css="css"/>
                </block>
            </div>
        </div>
    </div>
</template>
js的data部分也要添加css变量:
data(){
    return{
        //GameFrame内部包含的所有游戏,在GameFrame内部查询
        games:[],
        css:"game_item"
    }
},
包括gameFrame的游戏类型“仙侠”、游戏数量,都是由外部指定,也就是使用gameFrame组件的页面来指定,这个页面就是下一节的MobileGame.vue