Vue入门-Webpack入门-CMS页面查询开发

1. vue.js研究

1.1 vue.js介绍

  1. vue.js是什么?

Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。

渐进式框架:Progressive,说明vue.js的轻量,是指一个前端项目可以使用vue.js一两个特性也可以整个项目都用

vue.js。

自底向上逐层应用:作为渐进式框架要实现的目标就是方便项目增量开发。参考:https://cn.vuejs.org/v2/guide/

1.2 Vue.js的使用

  1. 在html页面使用script引入vue.js的库即可使用。

  2. 使用Npm管理依赖,使用webpack打包工具对vue.js应用打包。大型应用推荐此方案。

  3. Vue-CLI脚手架

    使用vue.js官方提供的CLI脚本架很方便去创建vue.js工程雏形。

1.3 vue.js有哪些功能?

  1. 声明式渲染

    Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统。比如:使用vue.js的插值表达式放在Dom的任意地方, 差值表达式的值将被渲染在Dom中。

  2. 条件与循环

    dom中可以使用vue.js提供的v-if、v-for等标签,方便对数据进行判断、循环。

  3. 双向数据绑定

    Vue 提供v-model 指令,它可以轻松实现Dom元素和数据对象之间双向绑定,即修改Dom元素中的值自动修改绑定的数据对象,修改数据对象的值自动修改Dom元素中的值。

  4. 处理用户输入

    为了让用户和你的应用进行交互,我们可以用v-on指令添加一个时间监听器,通过它调用在 Vue 实例中定义的方法

  5. 组件化应用构建

    vue.js可以定义一个一个的组件,在vue页面中引用组件,这个功能非常适合构建大型应用。

2. Vue.js基础

2.1 MVVM模式

vue.js是一个MVVM的框架,理解MVVM有利于学习vue.js。

  • MVVM拆分解释为:
    • Model:负责数据存储
    • View:负责页面展示
    • View Model:负责业务逻辑处理(比如Ajax请求等),对数据进行加工后交给视图展示
  • MVVM要解决的问题是将业务逻辑代码与视图代码进行完全分离,使各自的职责更加清晰,后期代码维护更加简单
  • 用图解的形式分析Ajax请求回来数据后直接操作Dom来达到视图的更新的缺点,以及使用MVVM模式是如何来解决这个缺点的
  • Vue中的 MVVM

从上图看出,VM(ViewModel)可以把view视图和Model模型解耦合,VM的要做的工作就是vue.js所承担的。

2.2 入门程序

本次测试我们在门户目录中创建一个html页面进行测试,正式的页面管理前端程序会单独创建工程。在门户目录中创建vuetest目录,并且在目录下创建vue_01.html文件

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF‐8">
        <title>vue.js入门程序</title>
        <script src="/js/vue/vue.min.js"></script>
    </head>
    <body>
        <div id="app">
            {{name}}
            <!‐‐ 在Vue接管区域中使用Vue的系统指令呈现数据这些指令就相当于是MVVM中的View这个角色 ‐‐>
        </div>
    </body>
    <script>
        // 实例化Vue对象
        //vm :叫做MVVM中的 View Model
        var VM = new Vue({
            el:"#app",//表示当前vue对象接管app的div区域
            data:{
                name:'传智播客'// 相当于是MVVM中的Model这个角色
            }
        });
    </script>
</html>

代码编写步骤:

  1. 定义html,引入vue.js
  2. 定义app div,此区域作为vue的接管区域
  3. 定义vue实例,接管app区域。
  4. 定义model(数据对象)
  5. VM完成在app中展示数据

2.3 1+1=2

实现效果:

代码如下:

<!DOCTYPE html>
<html lang="en" xmlns:v‐on="http://www.w3.org/1999/xhtml">
    <head>
        <meta charset="UTF‐8">
        <title>vue.js入门程序</title>

    </head>
    <body>
        <div id="app">
            <!‐‐{{name}}解决闪烁问题使用v‐text‐‐>
            <a v‐bind:href="url"><span v‐text="name"></span></a>
            <input type="text" v‐model="num1">+
            <input type="text" v‐model="num2">=
            <span v‐text="result"></span>
            <!‐‐ <span v‐text="Number.parseInt(num1)+Number.parseInt(num2)"></span>‐‐>
            <!‐‐{{num1+num2}}‐‐>
            <!‐‐<input type="text" v‐model="result">‐‐>
            <button v‐on:click="change">计算</button>
            <!‐‐ 在Vue接管区域中使用Vue的系统指令呈现数据这些指令就相当于是MVVM中的View这个角色 ‐‐>
        </div>
    </body>
    <script src="/js/vue/vue.min.js"></script>
    <script>
        // 实例化Vue对象

        //vm :叫做MVVM中的 View Model
        var VM = new Vue({
            el:"#app",//表示当前vue对象接管app的div区域data:{
            name:'黑马程序员',// 相当于是MVVM中的Model这个角色
            num1:0, num2:0, result:0,
            url:'http://www.itcast.cn'
        },
                         methods:{
                         change:function(){
            this.result = Number.parseInt(this.num1)+Number.parseInt(this.num2) alert(this.result)
        }
        }

        });
    </script>
</html>
  1. v-model

    在表单控件或者组件上创建双向绑定

    v-model仅能在如下元素中使用:

    input 
    select 
    textarea
    components(Vue中的组件)
    
  2. 解决插值表达式闪烁问题,使用v-text

    v-text可以将一个变量的值渲染到指定的元素中,它可以解决插值表达式闪烁的问题

  3. v-on绑定一个按钮的单击事件

  4. v-bind

    1、作用:
    v‐bind可以将数据对象绑定在dom的任意属性中。
    v‐bind可以给dom对象绑定一个或多个特性,例如动态绑定style和class
    
    2、举例:
    <img v‐bind:src="imageSrc">
    <div v‐bind:style="{ fontSize: size + 'px' }"></div>
    
    3、缩写形式
    <img :src="imageSrc">
    <div :style="{ fontSize: size + 'px' }"></div>
    

2.4 v-if和v-for

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF‐8">
        <title>Document</title>
        <script src="/js/vue/vue.min.js"></script>
    </head>
    <body>
        <div id="app">
            <ul>
                <!‐‐只显示偶数行‐‐>
                <li v‐for="(item,index) in list" :key="index" v‐if="index % 2==0">{{index}}‐{{item}}
                </li>
                <li v‐for ="(value,key) in user">{{key}}‐{{value}}</li>
                <li v‐for="(item,index) in userlist" :key="item.user.uname">
                    <div v‐if="item.user.uname=='heima'" style="background: chartreuse"><!‐‐名称为heima的加背景色‐‐>
                        {{index}}‐{{item.user.uname}}‐{{item.user.age}}
                    </div>
                    <div v‐else="">
                        {{index}}‐{{item.user.uname}}‐{{item.user.age}}
                    </div>

                </li>
            </ul>
        </div>
    </body>

    <script>
        new Vue({
            el:'#app', data:{
                list:[1,2,3,4,4],
                user:{uname:'itcast',age:10}, userlist:[
                    { user:{uname:'itcast',age:10}},
                    { user:{uname:'heima',age:11}}
                ]
            }
        });
    </script>
</html>

3. webpack入门

使用vue.js开发大型应用需要使用webpack打包工具,本节研究webpack的使用方法。

3.1 webpack介绍

Webpack 是一个前端资源的打包工具,它可以将js、image、css等资源当成一个模块进行打包。

从图中我们可以看出,Webpack 可以将js、css、png等多种静态资源 进行打包,使用webpack有什么好处呢?

  1. 模块化开发

    程序员在开发时可以分模块创建不同的js、 css等小文件方便开发,最后使用webpack将这些小文件打包成一个文件,减少了http的请求次数。

    webpack可以实现按需打包,为了避免出现打包文件过大可以打包成多个文件。

  2. 编译typescript、ES6等高级js语法

    随着前端技术的强大,开发中可以使用javascript的很多高级版本,比如:typescript、ES6等,方便开发,

    webpack可以将打包文件转换成浏览器可识别的js语法。

  3. CSS预编译

    webpack允许在开发中使用Sass 和 Less等原生CSS的扩展技术,通过sass-loader、less-loader将Sass 和 Less的语法编译成浏览器可识别的css语法。

webpack的缺点:

  1. 配置有些繁琐
  2. 文档不丰富

3.2 安装webpack

  1. 安装Node.js

    webpack基于node.js运行,首先需要安装node.js。

    下载对应你系统的Node.js版本: https://nodejs.org/en/download/

    测试:

    node -v
    
  2. 安装NPM

    1. 自动安装NPM

    npm全称Node Package Manager,他是node包管理和分发的工具,使用NPM可以对应用的依赖进行管理,NPM

    的功能和服务端项目构建工具maven差不多,我们通过npm 可以很方便地下载js库,打包js文件。

    node.js已经集成了npm工具,在命令提示符输入 npm -v 可查看当前npm版本

  1. 设置包路径

    包路径就是npm从远程下载的js包所存放的路径。

    使用 npm config ls 查询NPM管理包路径(NPM下载的依赖包所存放的路径)

  NPM默认的管理包路径在C:/用户/[用户名]/AppData/Roming/npm/node_meodules,为了方便对依赖包管理,我    们将管理包的路径设置在单独的地方,本教程将安装目录设置在node.js的目录下,**创建npm_modules和npm_cache**,执行下边的命令:

  本教程安装node.js在D:\Software\node-v10.16.0\node下所以执行命令如下:

  ```
  npm config set prefix "D:\Software\node-v10.16.0\node\npm_modules" 
  npm config set cache "D:\Software\node-v10.16.0\node\npm_cache"
  ```
  1. 安装cnpm
  npm默认会去国外的镜像去下载js包,在开发中通常我们使用国内镜像,这里我们使用淘宝镜像下边我们来安装cnpm:

  有时我们使用npm下载资源会很慢,所以我们可以安装一个cnmp(淘宝镜像)来加快下载速度。

  输入命令,进行全局安装淘宝镜像。

  ```
  npm install -g cnpm --registry=https://registry.npm.taobao.org
  ```

  安装后,我们可以使用以下命令来查看cnpm的版本

  ```
  cnpm -v
  ```

  `nrm ls` 查看镜像已经指向taobao

  使`nrm use XXX`切换 镜像

  如果nrm没有安装则需要进行全局安装:`cnpm install -g nrm`
  1. 安装webpack

    连网安装

    本地安装:将webpack安装到指定应用程序的目录下。

    进入这个目录,执行

    npm install --save-dev webpack 或 cnpm install --save-dev webpack
    

    全局安装:将webpack安装npm默认的依赖包的目录(前边配置在了nodejs的安装目录下)在任意目录,执行

    npm install -g webpack 或 cnpm install -g webpack
    

    建议指定webpack的版本进行安装

    全局安装:

    npm install webpack@3.6.0 -g或 cnpm install webpack@3.6.0 -g
    

    本地安装

    npm install --save-dev webpack@3.6.0 或 cnpm install --save-dev webpack@3.6.0
    

3.3 入门程序

  1. 通过入门程序实现对js文件的打包,体会webpack是如何对应用进行模块化管理。 对上边1+1=2的例子使用webpack进行模块化管理

  1. 定义模块:创建webpacktest01目录,将vue.min.js及vue_02.html拷贝到目录下。

    1. 定义model01.js

      在webpacktest01目录下创建model01.js

      将本程序使用的加法运算的js方法抽取到一个js文件,此文件就是一个模块

      // 定义add函数
      function add(x, y) { 
          return x + y
      }
      // function add2(x, y) {
      //    return x + y+1
      // }
      // 导出add方法
      module.exports.add = add;
      // module.exports ={add,add2};//如果有多个方法这样导出
      // module.exports.add2 = add2//如果有多个方法也可以这样导出
      
    2. 定义main.js

      在webpacktest01目录下创建main.js,main.js是本程序的js主文件,包括如下内容:

      1. 在此文件中会引用model01.js模块

      2. 引用vue.min.js(它也一个模块)

      3. 将html页面中构建vue实例的代码放在main.js中。

        var {add} = require('./model01.js'); 
        var Vue = require('./vue.min');
        var VM = new Vue({
            el:"#app",//表示当前vue对象接管app的div区域
            data:{
                name:'黑马程序员',// 相当于是MVVM中的Model这个角色
                num1:0, num2:0, result:0,
                url:'http://www.itcast.cn'
            },
            methods:{
                change:function(){
                    //这里使用了导入的model01.js文件中的add方法
                    this.result = add(Number.parseInt(this.num1),Number.parseInt(this.num2)) alert(this.result)
                }
            }
        })
        
    3. 打包测试

      上边将mode01.js模块及main.js主文件编写完成,下边使用webpack对这些js文件进行打包

      1. 进入程序目录,执行webpack main.js build.js ,这段指令表示将main.js打包输出为 build.js文件执行完成,观察程序目录是否出现build.js。

      2. 在html中引用build.js

        <!DOCTYPE html>
        <html lang="en" xmlns:v‐on="http://www.w3.org/1999/xhtml">
            <head>
                <meta charset="UTF‐8">
                <title>vue.js入门程序</title>
            </head>
            <body>
                <div id="app">
                    <!‐‐{{name}}解决闪烁问题使用v‐text‐‐>
                    <a v‐bind:href="url"><span v‐text="name"></span></a>
                    <input type="text" v‐model="num1">+
                    <input type="text" v‐model="num2">=
                    <span v‐text="result"></span>
                    <!‐‐{{num1+num2}}‐‐>
                    <!‐‐<input type="text" v‐model="result">‐‐>
                    <button v‐on:click="change">计算</button>
                    <!‐‐ 在Vue接管区域中使用Vue的系统指令呈现数据这些指令就相当于是MVVM中的View这个角色 ‐‐>
                </div>
            </body>
            <script src="build.js"></script>
            <script>
            </script>
        </html>
        

3.4 webpack-dev-server

webpack-dev-server开发服务器,它的功能可以实现热加载 并且自动刷新浏览器。

创建一个新的程序目录,这里我们创建webpacktest02目录,将webpack入门程序的代码拷贝进来,并在目录下创 建src目录、dist目录。

将main.js和model01.js拷贝到src目录。

3.4.1 安装配置

  1. 安装webpack-dev-server

    cnpm install webpack@3.6.0 webpack-dev-server@2.9.1 html-webpack-plugin@2.30.1 --save-dev
    

    安装完成自动创建package.json(记录了本程序所依赖的包信息)

    安装完成自动创建node_modules(存放了本程序所依赖的包)

  2. 在package.json中配置script(运行命令)

    "scripts": {
        "dev": "webpack‐dev‐server ‐‐inline ‐‐hot ‐‐open ‐‐port 5008"
    },
    
  3. 配置webpack.config.js

    在webpacktest02目录下创建 webpack.config.js

    webpack的配置文件,配置了入口文件、输入文件的路径、依赖的插件。

    1. 配置模板文件

      将原来的vue_02.html作为模板文件,为了和内存中的index.html文件名区别,注意将vue_02.html中的script标签去掉,内容如下:

      <!DOCTYPE html>
      <html lang="en" xmlns:v‐on="http://www.w3.org/1999/xhtml">
          <head>
              <meta charset="UTF‐8">
              <title>vue.js入门程序</title>
          </head>
          <body>
              <div id="app">
                  <!‐‐{{name}}解决闪烁问题使用v‐text‐‐>
                  <a v‐bind:href="url"><span v‐text="name"></span></a>
                  <input type="text" v‐model="num1">+
                  <input type="text" v‐model="num2">=
                  <span v‐text="result"></span>
                  <!‐‐{{num1+num2}}‐‐>
                  <!‐‐<input type="text" v‐model="result">‐‐>
                  <button v‐on:click="change">计算</button>
                  <!‐‐ 在Vue接管区域中使用Vue的系统指令呈现数据这些指令就相当于是MVVM中的View这个角色 ‐‐>
              </div>
          </body>
      </html>
      
    2. 配置html-webpack-plugin

      在webpack.config.js中配置html-webpack-plugin插件

      var htmlwp = require('html‐webpack‐plugin'); 
      module.exports={
          entry:'./src/main.js', //指定打包的入口文件
          output:{
              path : dirname+'/dist', // 注意: dirname表示webpack.config.js所在目录的绝对路径
              filename:'build.js'   //输出文件
          },
          plugins:[
              new htmlwp({
                  title: '首页', //生成的页面标题<head><title>首页</title></head>
                  filename: 'index.html',  //webpack‐dev‐server在内存中生成的文件名称,自动将build注入到这个页面底部,才能实现自动刷新功能
                  template: 'vue_02.html' //根据index1.html这个模板来生成(这个文件请程序员自己生成)
              })
          ]
      }
      
  4. 使用webpack的命令去运行程序

    进入 webpacktest02目录,执行

    npm run dev
    
  5. 使用debugger进行调试

    1. 在webpack.config.js中配置:

      devtool: 'eval‐source‐map',
      

      webpack.config.js部分内容如下:

      var htmlwp = require('html‐webpack‐plugin'); module.exports={
      entry:'./src/main.js', //指定打包的入口文件
      output:{
      path : dirname+'/dist', // 注意: dirname表示webpack.config.js所在目录的绝对路径
      filename:'build.js'   //输出文件
      },
      devtool: 'eval‐source‐map',
      ......
      
    2. 在要打断点的代码处加debugger

4. CMS前端工程创建

4.1 导入系统管理前端工程

CMS系统使用Vue-cli脚手架创建, Vue-cli是Vue官方提供的快速构建单页应用的脚手架,github地址: https://github.com/vuejs/vue-cli(有兴趣的同学可以参考官方指导使用vue-cli创建前端工程),本项目对Vue-cli 创建的工程进行二次封装,下边介绍CMS工程的情况。

4.1.1 工程结构

如果我要基于Vue-Cli创建的工程进行开发还需要在它基础上作一些封装,导入课程资料中提供Vue-Cli封装工程。

将课程资料中的xc-ui-pc-sysmanage.7z拷贝到UI工程目录中,并解压,用WebStorm打开xc-ui-pc-sysmanage目录。

4.1.2 package.json

package.json记录了工程所有依赖,及脚本命令:

  • 开发使用:npm run dev
  • 打包使用:npm run build

4.1.3 webpack.base.conf.js

webpack.base.conf.js就是webpack的webpack.config.js配置文件,在此文件中配置了入口文件及各种Loader。

webpack是通过vue-load解析.vue文件,通过css-load打包css文件等。

4.1.4 main.js

main.js是工程的入口文件,在此文件中加载了很多第三方组件,如:Element-UI、Base64、VueRouter等。index.html是模板文件。

4.1.5 src目录

src目录下存放页面及js代码。

  • assets:存放一些静态文件,如图片。
  • base:存放基础组件
  • base/api:基础api接口
  • base/component:基础组件,被各各模块都使用的组件base/router:总的路由配置,加载各模块的路由配置文件。
  • common:工具类
  • component:组件目录,本项目不用。
  • mock:存放前端单元测试方法。
  • module:存放各业务模块的页面和api方法。 下级目录以模块名命名,下边以cms举例:
    • cms/api:cms模块的api接口
    • cms/component:cms模块的组件
    • cms/page: cms模块的页面
    • cms/router:cms模块的路由配置
  • statics:存放第三方组件的静态资源
  • vuex:存放vuex文件,本项目不使用
  • static:与src的平级目录,此目录存放静态资源
  • 它与assets的区别在于,static目录中的文件不被webpack打包处理,会原样拷贝到dist目录下。

5. CMS前端页面查询开发

5.1 页面结构

在model目录创建 cms模块的目录结构

在page目录新建page_list.vue,扩展名为.vue。

.vue文件的结构如下:

<template>
<!‐‐编写页面静态部分,即view部分‐‐>
测试页面显示...
</template>
<script>
    /*编写页面静态部分,即model及vm部分。*/
</script>
<style>
    /*编写页面样式,不是必须*/
</style>

在页面的template中填写 “测试页面显示...”。

注意:template内容必须有一个根元素,否则vue会报错,这里我们在template标签内定义一个div。

5.2 页面路由

在cms目录下创建page_list.vue页面。

现在先配置路由,实现url访问到页面再进行内容完善与调试。

5.2.1 在cms的router下配置路由

import Home from '@/module/home/page/home.vue';
import page_list from '@/module/cms/page/page_list.vue'; 
export default [{
    path: '/cms',
    component: Home, 
    name: 'CMS内容管理', 
    hidden: false, 
    children:[
        {path:'/cms/page/list',name:'页面列表',component: page_list,hidden:false}
    ]
}]

5.2.2 在base目录下的router导入cms模块的路由

5.3 页面内容完善

根据需求完善页面内容,完善列表字段,添加分页组件。

<template>
<div>
    <!--编写页面静态部分,即view部分-->
    <el-button type="primary" size="small" v-on:click="query">查询</el-button>
    <el-table
              :data="list"
              stripe
              style="width: 100%">
        <el-table-column type="index" width="60">
    </el-table-column>
        <el-table-column prop="pageName" label="页面名称" width="120">
    </el-table-column>
        <el-table-column prop="pageAliase" label="别名" width="120">
    </el-table-column>
        <el-table-column prop="pageType" label="页面类型" width="150">
    </el-table-column>
        <el-table-column prop="pageWebPath" label="访问路径" width="250">
    </el-table-column>
        <el-table-column prop="pagePhysicalPath" label="物理路径" width="250">
    </el-table-column>
        <el-table-column prop="pageCreateTime" label="创建时间" width="180" >
    </el-table-column>
    </el-table>
    <el-pagination
                   layout="prev, pager, next"
                   :total="total"
                   :page-size="params.size"
                   :current-page="params.page"
                   v-on:current-change="changePage"
                   style="float:right">
    </el-pagination>
    </div>
</template>
<script>
    /*编写页面静态部分,即model及vm部分。*/
    import * as cmsApi from '../api/cms'
    export default {
        data() {
            return {
                list: [],
                total:0,
                params:{
                    page:1,
                    size:10
                }
            }
        },
        methods:{
            query:function(){
                // alert('查询')
                //调用服务端的接口
                cmsApi.page_list(this.params.page,this.params.size).then((res)=>{
                    //将res结果数据赋值给数据模型对象
                    this.list = res.queryResult.list;
                    this.total = res.queryResult.total;
                })

            },
            changePage:function(page){//形参就是当前页码
                //调用query方法
                // alert(page)
                this.params.page = page;
                this.query()
            }
        },
        mounted(){
            //当DOM元素渲染完成后调用query
            this.query()
        }
    }
</script>
<style>
    /*编写页面样式,不是必须*/
</style>

5.4. Api调用

在cms模块的api目录定义cms.js,

在cms.js中定义如下js方法,此方法实现http请求服务端页面查询接口。

//public是对axios的工具类封装,定义了http请求方法
import http from './../../../base/api/public' 
export const page_list = (page,size,params) => {
    return http.requestQuickGet('http://localhost:31001/cms/page/list/'+page+'/'+size)
}

axios实现了http方法的封装,vue.js官方不再继续维护vue-resource,推荐使用 axios。

前端页面导入cms.js,调用js方法请求服务端页面查询接口。

  1. 导入cms.js

  1. 在query方法中调用 page_list方法

5.5 跨域问题解决

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:11000' is therefore not allowed access.

原因:浏览器的同源策略不允许跨域访问,所谓同源策略是指协议、域名、端口相同。 解决:采用proxyTable解决。

proxyTable是什么?

vue-cli 提 供 的 解 决 vue 开 发 环 境 下 跨 域 问 题 的 方 法 ,proxyTable 的 底 层 使 用 了 http-proxy- middleware(https://github.com/chimurai/http-proxy-middleware),它是http代理中间件,它依赖node.js, 基本原理是用服务端代理解决浏览器跨域:

cms跨域解决原理:

  1. 访问页面http://localhost:11000/
  2. 页面请求http://localhost:11000/cms由于url由http://localhost:31001/cms...改为“http://localhost:11000/cms.",所以不存在跨域
  3. 通过proxyTable由node服务器代理请求http://localhost:31001/cms.

服务端不存在跨域问题

具体的配置如下:

  1. 修改api方法中url的定义

    请求前加/api前缀

  1. 在config/index.js下配置proxyTable。

    以/api/cms开头的请求,代理请求http://localhost:31001

5.6 分页查询

  1. 定义分页视图

    使用v-on监听更改分页事件

    <el-pagination
                   layout="prev, pager, next"
                   :total="total"
                   :page-size="params.size"
                   :current-page="params.page"
                   v-on:current-change="changePage"
                   style="float:right">
    </el-pagination>
    
  2. 定义数据模型对象

    export default {
        data() {
            return {
                list: [],
                total:0,
                params:{
                    page:1,
                    size:10
                }
            }
        },
        methods:{
            query:function(){
                // alert('查询')
                //调用服务端的接口
                cmsApi.page_list(this.params.page,this.params.size).then((res)=>{
                    //将res结果数据赋值给数据模型对象
                    this.list = res.queryResult.list;
                    this.total = res.queryResult.total;
                })
            },
            changePage:function(page){//形参就是当前页码
                //调用query方法
                // alert(page)
                this.params.page = page;
                this.query()
            }
        }
    

5.7 进入页面立即查询

目前实现的功能是进入页面点击查询按钮向服务端表求查询,实际的需求是进入页面立即查询。 如何实现?

这要用到vue的钩子函数,每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听、编译模板、将实例挂载到 DOM 并在数据变化时更新 DOM 等。同时在这个过程中也会运行一些叫做生命周期钩子的函数,这给了用户在不同阶段添加自己的代码的机会。

通常使用最多的是created和mounted两个钩子:

  • created:vue实例已创建但是DOM元素还没有渲染生成。
  • mounted:DOM元素渲染生成完成后调用。

本例子在两个方法的任意一个都满足需求:

添加如下代码

6. 前后端请求响应流程小结

  1. 在浏览器输入前端url
  2. 前端框架vue.js根据url解析路由,根据路由找到page_list.vue页面
  3. 首先执行page_list.vue中的钩子方法
  4. 在钩子方法中调用query方法。
  5. 在query方法中调用cms.js中的page_list方法
  6. cms.js中的page_list方法通过axios请求服务端接口
  7. 采用proxyTable解决跨域问题,node.js将请求转发到服务端(http://localhost:31001/cms/page/list`)
  8. 服务端处理,将查询结果响应给前端
  9. 成功响应调用then方法,在then方法中处理响应结果,将查询结果赋值给数据模型中的total和list变量。
  10. vue.js通过双向数据绑定将list数据渲染输出。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容