摘要

Vue.js的长处有很多,然而其应用门槛对于只学习过一般的我的项目的同学来说,还是比拟有挑战性的,如果你真的想把Vue学的很溜,真的须要一个十分零碎的学习能力使用起来。因为学习Vue你不仅仅是学习他的语法、API和一些开发的标准,你还要学习构建工具的应用、调试、打包等等,有些人连最根本的开发环境都还没能顺利搭建起来。

如果你不想应用Vue弱小的生态和工具,只想在html页面中应用Vue也是能够的,因为Vue也有一个全局的生产环境cdn(vue.global.prod.min.js),你能够应用这个cdn来应用Vue构建比拟小型的我的项目。

我的项目介绍

写这篇文章的起因是我应用了Vue3的组合式Api实现了一个非常简单的单页,具体信息如下:

我的项目:围绕广东省3+证书招生考试信息为数据,开发一个招生院校、招生业余信息查问和展现页面。

数据:广东3+证书招生院校目录、招生业余目录。

我的项目截图:

代码构造:

上代码

index.html

代码中引入了 vue.global.prod.min.js 用于应用Vue的API,引入了 vue-router.js 实现路由性能,引入了 axios.min.js 实现申请接口获取数据。

在app节点下通过 <router-view></router-view> 渲染对应路由的内容。

要害的代码都在 app.js 中应用Vue3的组合式API实现数据申请和数据响应式渲染。所以通过模块的形式引入了 app.js

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>广东省3+证书(中职)招生打算</title>    <script src="js/vue.global.prod.min.js"></script>    <script src="js/vue-router.js"></script>    <script src="js/axios.min.js"></script>    <link rel="stylesheet" href="css/app.css">    <style>        .college-card {            width: 100%;            display: flex;            border-bottom: 1px solid #eee;            background: #fff;        }        .college-card .college-logo {            width: 90px;        }        .college-card .college-logo img {            width: 55px;            height: 55px;            margin: 25px 15px 15px 20px;            border-radius: 100px;        }        .college-card .college-info {            flex: 1;        }        .college-card .college-name {            width: 100%;            height: 45px;            line-height: 45px;            font-size: 17px;            font-weight: bold;            color: #333;        }        .college-card .college-category {            width: 100%;            height: 25px;        }        .college-card .college-category .tag {            background: #fff4ef;            color: #ff7637;            padding: 3px 6px;            font-size: 12px;            margin-right: 8px;            border-radius: 5px;        }        .college-card .college-plan {            width: 100%;            height: 30px;            line-height: 30px;            font-size: 14px;            color: #999;            padding-bottom: 5px;        }        .college-card .next {            width: 30px;            background: url('img/next.png')no-repeat;            background-size: 80%;            background-position: center;            opacity: 0.5;        }                .college-info {            background: #fff;        }        .college-info .info-header {            width: 100%;            margin: 0 auto;            display: flex;            border-bottom: 1px solid #eee;            padding-top: 15px;        }        .college-info .info-header .info-logo {            width: 90px;        }        .college-info .info-header .info-logo img {            width: 60px;            height: 60px;            margin: 25px 15px 15px 10px;            border-radius: 100px;        }        .college-info .info-header .info {            flex: 1;        }        .college-info .info-header .info .college-name {            width: 100%;            height: 45px;            line-height: 45px;            font-size: 20px;            font-weight: bold;            color: #333;        }        .college-info .info-header .info .college-tag {            width: 100%;            height: 25px;        }        .college-info .info-header .info .college-tag .info-tag {            background: #fff4ef;            color: #ff7637;            padding: 3px 6px;            font-size: 12px;            margin-right: 8px;            border-radius: 5px;        }        .college-info .info-header .info .info-plan {            width: 100%;            height: 30px;            line-height: 30px;            font-size: 14px;            color: #999;        }                .college-info-nav {            width: 100%;            display: flex;        }        .college-info-nav .nav-tag {            flex: 1;            height: 40px;            line-height: 40px;            text-align: center;            font-size: 15px;            color: #666;        }                .college-info-plan {            width: 95%;            background: #fff;            margin: 15px auto 0;            overflow: hidden;            border-radius: 10px;        }        .college-info-plan .college-info-plan-year {            width: 93%;            height: 30px;            margin: 15px auto 0;        }        .college-info-plan .college-info-plan-year .plan-year {            padding: 6px 10px;            background: #eee;            font-size: 15px;            margin-right: 10px;            border-radius: 10px;            color: #666;        }        .college-info-plan .college-info-plan {            width: 93%;            height: 30px;            margin: 10px auto;            font-size: 14px;        }                .college-info-plan .college-info-plan-zyz {            width: 93%;            height: 20px;            margin: 10px auto 0;            font-size: 15px;            color: #ff7637;            font-weight: bold;        }        .college-info-plan .college-info-zyz-plan {            width: 93%;            height: 20px;            margin: 5px auto;            font-size: 14px;        }        .college-info-plan .college-info-zyz-major {            width: 93%;            margin: 15px auto;            font-size: 14px;        }        .college-info-plan .college-info-zyz-major table{            width: 100%;            border-collapse: collapse;            border-spacing: 0;            text-align: center;            margin: 0 auto;            position: relative;        }        .college-info-plan .college-info-zyz-major th{            background: #fff4ef;        }        .college-info-plan .college-info-zyz-major th,td{            padding: 6px 10px;            border: 1px solid #ff7637;        }                .zyzList {            background: #fff;            width: 95%;            margin: 20px auto 0;            overflow: hidden;            border-radius: 10px;        }        .zyzList table {            width: 93%;            font-size: 13px;            text-align: center;            border-collapse: collapse;            margin: 10px auto;        }        .zyzList table th {            padding: 6px 0;            border: 1px solid #eee;        }        .zyzList table td {            border: 1px solid #eee;            color: #666;        }                .majorList {            background: #fff;            width: 95%;            margin: 20px auto 0;            overflow: hidden;            border-radius: 10px;        }        .majorList table {            width: 93%;            font-size: 13px;            text-align: center;            border-collapse: collapse;            margin: 10px auto;        }        .majorList table th {            padding: 6px 0;            border: 1px solid #eee;        }        .majorList table td {            border: 1px solid #eee;            color: #666;        }                .list-title {            width: 93%;            margin: 15px auto 0;            display: block;            font-size: 15px;            color: #ff7637;            font-weight: bold;        }    </style></head><body>        <div id="app">        <router-view></router-view>    </div>        <!--引入Vue利用实例-->    <script type="module" src="js/app.js"></script></body></html>

app.js

app.js 也是比较简单的,构建组件代码,而后将组件创立到路由当中渲染到app节点。

const { createApp, ref } = Vue;const { createRouter, createWebHashHistory, useRouter, useRoute } = VueRouter;// 院校列表const collegeList = {    template: `    <div>        <div v-for="college in collegeListData.collegeList" :key="college.college_code" class="college-card" @click="showCollegeInfo(college.college_code)">            <div class="college-logo">                <img :src="'img/college_logo/' + college.college_logo" />            </div>            <div class="college-info">                <p class="college-name">{{ college.college_name }}</p>                <p class="college-category">                    <span class="tag"> {{ college.college_public === 0 ? '公办' : '民办' }} </span>                    <span class="tag"> {{ college.college_city }} </span>                    <span class="tag"> {{ college.college_category }} </span>                </p>                <p class="college-plan">2023年招生打算{{ college.college_plan_2023 }}人</p>            </div>            <div class="next"></div>        </div>    </div>`,    setup() {        const collegeListData = ref([]);        const router = useRouter();        axios.get('./getCollegeList/')            .then(response => {                collegeListData.value = response.data;            })            .catch(error => {                console.error('Error fetching JSON data:', error);            });        const showCollegeInfo = (college_code) => {            router.push(`/college/${college_code}`);        };        return {            collegeListData,            showCollegeInfo,        };    },};// 院校详情const collegeDetails = {    template: `    <div>        <div class="college-card">            <div class="college-logo">                <img :src="'img/college_logo/' + collegeInfo.college_logo" />            </div>            <div class="college-info">                <p class="college-name">{{ collegeInfo.college_name }}</p>                <p class="college-category">                    <span class="tag"> {{ collegeInfo.college_public === 0 ? '公办' : '民办' }} </span>                    <span class="tag"> {{ collegeInfo.college_city }} </span>                    <span class="tag"> {{ collegeInfo.college_category }} </span>                </p>                <p class="college-plan">2023年招生打算{{ collegeInfo.college_plan_2023 }}人</p>            </div>        </div>        <div class="zyzList">            <span class="list-title">院校专业组</span>            <table>                <tr>                    <th>专业组</th>                    <th>打算</th>                    <th>备注</th>                </tr>                <tr v-for="zyz in zyzList" :key="zyz.zyz_code">                    <td>{{zyz.zyz_code}}</td>                    <td>{{zyz.zyz_plan}}</td>                    <td>{{zyz.zyz_bz}}</td>                </tr>            </table>        </div>        <div class="majorList">            <span class="list-title">招生业余目录</span>            <table>                <tr>                    <th>专业组</th>                    <th>业余</th>                    <th>打算</th>                    <th>最低分/排位</th>                </tr>                <tr v-for="major in majorList" :key="major.major_code">                    <td>{{major.major_zyzcode}}</td>                    <td>{{major.major_name}}</td>                    <td>{{major.major_number}}</td>                    <td v-if="major.major_lowest_score > 0">{{major.major_lowest_score}}/{{major.major_lowest_rank}}</td>                    <td v-else> / </td>                </tr>            </table>        </div>    </div>`,    setup() {        const collegeInfo = ref({});        const majorList = ref({});        const zyzList = ref({});        const route = useRoute();        const id = route.params.id;        axios.get('./getMajorList/?college_code=' + id)            .then(response => {                collegeInfo.value = response.data.collegeInfo[0];                majorList.value = response.data.majorList;                zyzList.value = response.data.zyzList;            })            .catch(error => {                console.error('Error fetching college details:', error);            });        return {            collegeInfo,            majorList,            zyzList        };    },};// 创立路由const router = createRouter({    history: createWebHashHistory(),    routes: [        { path: '/', component: collegeList },        { path: '/college/:id', component: collegeDetails },    ],});// 创立Vue利用const app = createApp({});app.use(router);// 挂载利用app.mount('#app');

残缺代码

https://likeyun.lanzout.com/iOAnJ1otloaf

演示

https://demo.likeyunba.com/san-jia-zheng-shu

手机网页,倡议应用手机拜访:

作者

TANKING