天天看點

vue使用mock.js模拟資料

一、安裝

1、安裝 mock axios

npm install mockjs axios --save

2、安裝axios-mock-adapter

axios-mock-adapter 是axios與mock配置器,簡單來說就是把二者結合在一起的工具

npm install axios-mock-adapter --save-dev

二、使用mock

1、在src目錄下,建立mock檔案夾,在下面再建立data檔案夾,建立資料檔案,比如user.js,用于模拟生成使用者資訊資料,初始化我們需要的資料,這裡舉例初始化使用者資訊資料

//user.js
import Mock from 'mockjs'; // 導入mockjs 子產品
let Users = []; // 定義我們需要的資料,後面導出
const COUNT = [1, 2, 3, 4, 5]; // 定義我們需要數量,即生成幾條模拟資料
for (let i = 1; i <= COUNT.length; i++) {
  Users.push(Mock.mock({ // 根據資料模闆生成模拟資料。
    id: Mock.Random.guid(), // 随機id
    title: Mock.Random.first(), // 随機标題
        name:Mock.Random.cname(),  //随機中文名
        addr: Mock.mock('@county(true)'),  //随機位址
    'age|18-60': 1,  //随機年齡
    birth: Mock.Random.date(),  //随機生日
    sex: Mock.Random.integer(0, 1)  //随機性别
    isDelete: false, //是否删除
    locked: Mock.Random.boolean(), // 随機鎖定
    record: COUNT.map(() => { // ×××單項清單的資料
      return {
        text: Mock.Random.cparagraph(2), // 随機内容
        isDelete: false, //是否删除
        checked: Mock.Random.boolean()  //是否完成
      };
    })
  }));
}
export { // 導出使用者資料
  Users
};           

2、建立mock,js

核心檔案,它的作用就是模拟ajax請求的接口,生成并傳回模拟資料.

import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
import Mock from 'mockjs';
import { Users } from './data/user.js'; // 導入Users資料
export default {
  /**
   * mock start
   */
  start() { // 初始化函數
    let mock = new MockAdapter(axios); // 建立 MockAdapter 執行個體

        //擷取使用者清單
    mock.onGet('/user/list').reply(config => { //  config 指 前台傳過來的值  網址自己随意定義,通路時要和這個網址一緻就可以,這個'/user/list',就是get請求時的url位址
      let {name} = config.params;
      let mockUsers = Users.filter(user => {
        if (name && user.name.indexOf(name) == -1) return false;
        return true;
      });
      return new Promise((resolve, reject) => {  //響應請求,傳回資料給前台
        setTimeout(() => {
          resolve([200, {
            users: mockUsers
          }]);
        }, 1000);
      });
    });

    mock.onGet('/todo/list').reply(config => { //  config 指 前台傳過來的值
      let mockTodo = Todos.map(tode => { // 重組 Todos數組,變成我們想要的資料
        return {
          id: tode.id, 
          title: tode.title,
          count: tode.record.filter((data) => {
            if (data.checked === false) return true;
            return false;
          }).length, // 過濾到record裡面 ‘checked’ 為true的資料,因為它們已經被完成了
          locked: tode.locked,
          isDelete: tode.isDelete
        };
      }).filter(tode => {
        if (tode.isDelete === true) return false; // 過濾掉 ‘isDelete’為true,因為已經被删除了。
        return true;
      });
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve([200, {
            todos: mockTodo // 傳回狀态為200,并且傳回todos資料
          }]);
        }, 200);
      });
    });
        // 新增一條todo
    mock.onPost('/todo/addTodo').reply(config => {
      Todos.push({
        id: Mock.Random.guid(),
        title: 'newList',
        isDelete: false,
        locked: false,
        record: []
      });
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve([200]);
        }, 200);
      });
    });
  }
};           

3、導出 mock

建立src/mock/index.js,并且複制以下代碼,這裡的index作用在于友善其他檔案引入。

import mock from './mock'; 
export default mock; // 導入同級下mock.js的内容,并且導出           
import Mock from './mock'; // 引入mock子產品
Mock.start(); //并且執行初始化函數           
  • 建立 src/api/api.js
  • 我們把所有需要調用的接口,全部寫到一個檔案裡面,封裝成一個一個的函數,需要使用的時候我們直接調用這個函數即可,這裡寫的話,邏輯就比較清晰,接口需要改動的時候也能快速定位,維護成本就降低了。
  • 複制下面代碼到 src/api/api.js
    import axios from 'axios'; //導入axios子產品
    export const getTodoList = params => { //封裝一個函數,名為getTodoList
    return axios.get(`/todo/list`, { // 請求路徑 ‘/todo/list’
    params: params
    });
    };
    export const addTodo = params => {
    return axios.post(`/todo/addTodo`, params).then(res => res.data);
    };           
  • vue生命周期
  • created()函數,一般是執行個體建立完成,但是dom還沒有開始渲染時候執行,如果我們想在頁面渲染之前就請求資料,那麼我們就把ajax放在裡面。
  • 綁定class
  • 複制以下代碼到 src/components/menus.vue
    <template>
    <!--綁定點選事件goList),并且判斷當todoId 時候 item.id時,文字高亮度-->
    <div class="list-todos">
    <!-- 綁定class,當items循環中的id等于我們設定的選中todoId時候,就會加上active這個calss,這樣樣式就會發生變化。-->
    <a @click="goList(item.id)" class="list-todo list activeListClass" :class="{'active': item.id === todoId}" v-for="item in items">
      <span class="icon-lock" v-if="item.locked"></span>
      <span class="count-list" v-if="item.count > 0">{{item.count}}</span>
      {{item.title}}
    </a>
    <a class=" link-list-new" @click="addTodoList">
      <span class="icon-plus">
      </span>
      新增
    </a>
    </div>
    <template/>
    <script>
    import { getTodoList, addTodo } from '../api/api'; // 引入我們 封裝好的兩個接口函數。
    export default {
    data() {
    return {
      items: [], // 菜單資料
      todoId: '' // 預設選中id
    };
    },
    created() { // 調用請求菜單清單資料的接口
    getTodoList({}).then(res => {
      const TODOS = res.data.todos; // 資料都會傳回在res.data裡面。
      this.items = TODOS; // 我的把菜單資料指派給定義的this.items
      this.todoId = TODOS[0].id; // 把菜單資料的預設的第一個對象的id指派給預設選中的id
    });
    },
    methods: {
    goList(id) { // 點選菜單時候,替換選中id
      this.todoId = id;
    },
    addTodoList() { // 點選新增按鈕時候
    // 調用新增菜單的接口,在接口調用成功在請求資料
      addTodo({}).then(data => {
        getTodoList({}).then(res => {
          const TODOS = res.data.todos;
          this.todoId = TODOS[TODOS.length - 1].id;
          this.items = TODOS;
        });
      });
    }
    }
    };
    </script>