Vue组件库 - Unit04

133 阅读10分钟
每天给自己一个希望,试着不为明天而烦恼,不为昨天而叹息,只为今天更美好!人生没有对错,只有选择后的坚持,不后悔,走下去,就是对的。走着走着,花就开了。

本期主要内容

本期内容步骤示例清晰明了,内容如有争议请联系作者:TEL/V:15200025778

1.学子问答项目实践基础

2.首页顶部选项卡的实现

3.首页面板数据的实现 -- 全部数据的获取

1.学子问答项目实践基础

1.1 数据表结构

• xzqa_category (文章类型表)

• xzqa_author (文章作者表)

• xzqa_article (文章表)

数据表 ER 图如下:

1.2 数据导入

• 方法1

A.启动操作系统命令行

B.输入以下命令

mysql -u用户名 -p密码 < SQL脚本文件的位置及名称

• 方法2

A.启动操作系统命令

B.登录 MySQL 客户端

C.输入以下命令

source SQL脚本文件的位置及名称

1.3 MySQL常用命令

• 查看当前服务器的数据库列表

SHOW DATABASES;

• 打开数据库

USE 数据库名称;

• 查看当前数据库包含的数据表列表

SHOW TABLES;

• 查看特定数据表结构

DESC 数据表名称; 

或者

SHOW COLUMNS FROM 数据表名称;

• 退出MySQL 客户端

exit;

或者

quit;

1.4 WEB工作流程

2.首页顶部选项卡的实现

原始情况下,顶部选项卡的数据是固定的,示例代码如下:

<mt-navbar v-model="active">

    <mt-tab-item id="1">HTML5</mt-tab-item>

    <mt-tab-item id="2">CSS3</mt-tab-item>

    <mt-tab-item id="3">JavaScript</mt-tab-item>

    <mt-tab-item id="4">MySQL</mt-tab-item>

    <mt-tab-item id="5">jQuery</mt-tab-item>

</mt-navbar>

但是,现在已经提供了xzqa_category的数据表,在该表中存储了文章的分类信息,所以应该由该表的记录来决定顶部选项卡的数量及显示文本等信息。

其实现过程将涉及以下几个问题?

•在什么情况下发送请求到WEB服务器?

•如何在WEB服务器中获取MySQL数据库中的数据?

• 在什么情况下发送请求到WEB服务器?

在页面加载成功后应该获取文章分类信息显示的顶部选项卡中 ! -- 引申出 Vue生命周期及其钩子函数

•beforeCreate

•created

•beforeMount

•mounted

•beforeUpdate

•updated

•beforeDestroy

•destroyed

现在采用mounted钩子函数在触发时来发送请求到WEB服务器,此时的示例代码如下:

<script>
export default {
  data(){
      return {
      	...
      }
  },
  mounted(){
  }
}
</script>

在上述代码中,mounted钩子函数书写完成了,现在的问题是:通过什么发送请求呢?-- Axios

既然需要Axios,也就必须进行Axios的安装与配置! Axios安装提示:

npm install --save axios

Vue中配置Axios -- 在main.js中实现:

import axios from 'axios';

//WEB服务器的URL地址

axios.defaults.baseURL = 'http://127.0.0.1:3000/'

//在Vue原型扩展属性

Vue.prototype.axios = axios;

提示:Node服务器的端口为3000

此时即可在mounted钩子函数内通过axios来发送HTTP请求了,示例代码如下:

mounted(){
    this.axios.get('WEB服务器API地址');

}

因为现在并不存在WEB服务器,所以既使配置了AXIOS也无法发送真正的AJAX请求,所以必须先行配置WEB服务器才可以!所以:

第一步:配置WEB服务器

A、安装express框架

npm install --save express

B、在服务器目录创建app.js -- Node.js的入口文件

C、在app.js中输入以下代码:

/加载Express模块

const express = require("express");


//创建Express应用

const server = express();

//指定WEB服务器的监听端口

server.listen(3000,()=>{

  console.log('服务器启动...');

});

D、在VSCode编辑器的终端输入以下命令启动WEB服务器

node app.js

E、在app.js中创建GET路由接口 -- /categories

此时完整的示例代码如下:

//加载Express模块

const express = require("express");

//创建Express应用

const server = express();

//获取所有文章分类的接口

server.get('/categories',(req,res)=>{

    res.send('OK');

});

//指定WEB服务器的监听端口

server.listen(3000,()=>{

  console.log('服务器启动...');

});

F、重新WEB服务器

第二步:修改mounted钩子函数的AJAX请求

此时的示例代码如下:

mounted(){

	this.axios.get('/categories');

}

此时脚手架运行结果如下图所示:

此时的错误信息由于跨域操作引起的! -- 引申出CORS模块,所以: A、在Node服务器上安装CORS 模块

npm install --save cors

B、在app.js文件中以输入代码:

//加载cors模块

const cors = require("cors");

server.use(cors({

    origin:['http://localhost:8080','http://127.0.0.1:8080']

}));

此时完整的示例代码如下:

//加载Express模块

const express = require("express");

//加载cors模块

const cors = require("cors");

//创建Express应用

const server = express();

//使用CROS模块

server.use(cors({

    origin:['http://localhost:8080','http://127.0.0.1:8080']

}));

//获取所有文章分类的接口

server.get('/categories',(req,res)=>{

    res.send('OK');

});

//指定WEB服务器的监听端口

server.listen(3000,()=>{

  console.log('服务器启动...');

});

C、重新启动WEB服务器

此时脚手架的运行结果如下图所示:

• 如何在WEB服务器中获取MySQL数据库中的数据?

在Node.js环境下,要操作MySQL数据库的话,需要通过mysql模块实现,所以现在需要WEB服务器上安装并且配置MySQL模块,故:

A、安装MySQL模块

npm install --save mysql

B、在app.js中完成mysql的配置,示例代码如下:

//加载MySQL模式

const mysql = require("mysql");

//创建MySQL连接池

const pool = mysql.createPool({

    host:'127.0.0.1',

    port:3306,

    user:'root',

    password:'',

    database:'xzqa',

    connectionLimit:15

});

C、在/categories 接口中完成获取xzqa_category数据表记录的功能: /categories 接口的代码如下:

server.get('/categories',(req,res)=>{

    //获取xzqa_category数据表的全部记录

    let sql = 'SELECT id,category_name FROM xzqa_category';

    //通过MySQL连接池执行SQL语句

    pool.query(sql,(err,results)=>{

         if(err) throw err;

         res.send({message:'查询成功',code:1,results:results});

    });

});

D、重新启动WEB服务器

此时WEB服务器的运行结果如下图所示:

此时证明已经从WEB服务器获取到了文章分类的信息!

既然服务器已经成功返回数据,现在必须在客户端接收并且显示数据

• 在客户端接收并且显示数据

当客户端接收到服务器返回的文章分类数据后,应该将其存储到Vue的变量中,然后再通过v-for指令来循环输出,以控制顶部选项卡的数量及内容。所以:

A、为了能够在Vue中保存服务器返回的文章分类数据,所以需要声明变量,而且数据类型为array类型(因为文章分类有多个),示例代码如下:

<script>
export default{
	data(){
		return {
			//存储服务器返回的文章分类数据
			categories:[]
		}
	}
}
</script>

现在已经声明了变量,但是还没有接收服务器返回的文章类型数据。

B.在mounted钩子函数中,当HTTP响应成功从WEB服务器返回后,就接收返回数据并且存储到categories 变量中,示例代码如下:

mounted(){
	this.axios.get('/categories').then(res=>{
		this.categories = res.data.results;
	});
}

现在已经将服务器返回的文章分类数据存储到了categories变量中,现在只缺少通过v-for指令来动态决定顶部选项卡的数量及内容了。

C、在顶部选项卡组件中通过v-for指令动态控制其数量及内容,示例代码如下:

<!-- 顶部选项卡开始 -->
<mt-navbar v-model="active">
    <mt-tab-item
         v-for="(category,index) of categories"
         :id="category.id" 
         :key="index">
    {{category.category_name}}
    </mt-tab-item>      
</mt-navbar>
<!-- 顶部选项卡结束 -->

D、在正常情况下,面板中包含的<mt-tab-container-item>的数量应该与<mt-tab-item>的数量是完全一致!而现在<mt-tab-item>的数量是动态的,那么也就意味着<mt-tab-container-item>的数量也必须是动态的!所以:

再通过categories变量来决定<mt-tab-container-item>的数量,示例代码如下:

<mt-tab-container v-model="active">
	<mt-tab-container-item 
		v-for="(category,index) of categories"
		:key="index"
		:id="category.id">
      <!--内容部分省略-->
	</mt-tab-container-item>
</mt-tab-container>

提示:

原来和中v-model绑定的变量数据类型为string,原因为是因为每个项目的ID是手动赋予的字符串,而现在每个项目的id是动态的数值类型的属性(因为MySQL中ID字段的数据类型为数值型),所以active变量需由原来的'1'改成1,示例代码如下:

<script>
export default{
	data(){
		return {
			active:1
		}
	}
}
</script>

3.首页面板数据的实现 -- 全部数据的获取

在页面初始化的情况下,就”应该“获取出所有的文章列表,以显示在面板中。所以将涉及到:

•在什么情况下要获取全部的文章列表? -- 涉及到Vue生命周期及钩子函数 所以现在仍然需要在Vue的mounted钩子函数中发送请求到WEB服务器,以获取全部文章列表,示例代码如下:

mounted(){
	this.axios.get("获取全部文章的服务器API地址");
}

现在也就意味着必须在WEB上存在相应的API接口地址,才能在客户端发送AJAX请求,所以:

第一步:修改WEB服务器的相关配置

因为在前面的API中已经完成了WEB服务器的创建、解决了跨域、实现了MySQL的连接池,所以现在只需要在WEB上添加相关的API接口即口,代码如下:

//获取所有文章的接口(后续要调整)
server.get('/articles',(req,res)=>{
    //获取xzqa_article数据表全部记录
    let sql = 'SELECT id,subject,description,image FROM xzqa_article';
    //通过MySQL连接池执行SQL语句
    pool.query(sql,(err,results)=>{
        if(err) throw err;
        res.send({message:'查询成功',code:1,results:results})
    })
});

完成上述代码后,切记要重新启动WEB服务器!

第二步:修改mounted中的AJAX请求地址,示例代码如下:

mounted(){
	//获取全部文章数据
    this.axios.get('/articles');
}

此时WEB服务器的运行结果如下图所示:

如上图所示,WEB服务器已经成功返回数据到客户端,所以在客户端中必须接收并且显示数据!

为了能够在客户端接收WEB服务器返回的数据,所以必须在客户端声明变量以存储数据,而且该变量的数据类型为 array(因为服务器存在多篇文章数据),示例代码如下:

<script>
export default{
    data(){
        return {
            //存储WEB服务器返回的文章信息
			articles:[]
        }
    }
}
</script>

既然现在已经声明变量,那么就应该将WEB服务器返回的数据存储到该变量中,示例代码如下:

mounted(){
    //获取全部文章数据
    this.axios.get('/articles').then(res=>{
        this.articles = res.data.results;
    });    
}

现在已经将WEB服务器返回的数据存储到了articles变量中了,现在就应该通过v-for指令来进行循环输出,以显示不同的文章标题、简介等信息,示例代码如下:

<!-- 单一文章信息开始 -->             
<div 
     class="info-item" 
     v-for="(article,index) of articles"
     :key="index">
    <!-- 标题区域开始 -->
    <div class="info-item-head">
        <router-link to="/">{{article.subject}}</router-link>
    </div>
    <!-- 标题区域结束 -->
    <!-- 内容区域开始 -->
    <div class="info-item-content">
        <!-- 图像区域开始 -->
        <div class="info-item-img">
            <img src="../assets/images/articles/v2-c9acade792e89a7af148803dfbad0821_224x148.jpg" alt="">
        </div>
        <!-- 图像区域结束 -->
        <!-- 内容简介区域开始 -->
        <div class="info-item-des">
            {{article.description}}
        </div>
        <!-- 内容简介区域结束 -->
    </div>
    <!-- 内容区域结束 -->
</div>
<!-- 单一文章信息结束 -->