[經典案例]使用Vue-cli實現路由間的跳轉與呼叫介面完成前端頁面資料的渲染與顯示-文章列表專案

這名字帥吧發表於2020-10-21

前端vue 的老師飛快的講了如何使用Vue完成前端頁面資料的渲染,聽的懵懵懂懂,回頭細心琢磨了一下,寫了筆記加深一下印象,有興趣的小夥伴也可以看一下學習一下; 文章最後附帶專案原始碼。


前言

廢話不多說,先上效果圖。

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述

在這裡插入圖片描述
主頁面分為三個板塊,在這裡插入圖片描述
分別為頂部文章管理、文章列表,中部的文章列表資料渲染頁面,還有底部固定的footer導航。

最後還有點選返回跳轉到主頁面的主功能。


開始做記錄專案吧。

一、首先建立components元件。

示例:pandas 是基於NumPy 的一種工具,該工具是為了解決資料分析任務而建立的。

二、其次配置路由。

1.建立專案在router資料夾下的index.js檔案中配置路由。

在這裡插入圖片描述

程式碼如下(示例):

這裡需要注意的是二級路由children ,因為jinengHome這個元件是主頁面,jinnegDetail.vue 是二級頁面 ,jinnegList.vue與主頁面是同級的元件。

import jinengDetail from '@/components/jinengDetail.vue'
import jinengList from '@/components/jinengList.vue'
import jinengHome from '@/components/jinengHome.vue'


// 路由配置程式碼:這裡需要注意的是二級路由children ,因為jinengHome這個元件是主頁面,jinnegDetail.vue 是二級頁面	,jinnegList.vue與主頁面是同級的元件。
 routes: [{
            path: '/jinengHome',
            name: 'jinengHome',
            component: jinengHome,
            children: [

                {
                    path: '/jinengDetail',
                    name: 'jinengDetail',
                    component: jinengDetail
                },

                {
                    path: '/',
                    name: 'jinengList',
                    component: jinengList
                },
            ]
        },
]

2.引入圖片資原始檔


在這裡插入圖片描述

3.之後開始寫主頁面jinengHome元件的程式碼

需要注意的是每一個元件裡面必須要有<template /template>
而且模板裡面必須包裹一個 div

<template>  // 模板
  <div class="container">
    <div class="page-title" :style="{ 'justify-content': currentPath === '/jinengList' ? 'center' : 'space-between',
      }">
 // :style  動態繫結樣式, 冒號代表 v-bind  繫結樣式。
 <router-link id="goBack"
  v-show="currentPath === '/jinengDetail'" to="/">返回</router-link>
  // 給返回按鈕新增一個v-show 指令,讓他停留在主頁面的時候隱藏,到詳情頁的時候顯示。
      <span>文章管理</span>
      // 為儲存按鈕新增跳轉時顯示隱藏的效果
      <router-link id="save"  v-show="currentPath === '/jinengDetail'" to="/jinengList">儲存</router-link>
    </div>
	// 頭部的文章標籤欄切換的效果,為li 繫結類名並同時新增 @click 點選事件,選中狀態變紅色,未選中為預設狀態。
    <ul class="page-tab">
      <li
        :class="{ active: currentItem === item }"
        @click="changeItem(item)"
        v-for="(item, index) in arr"
        :key="index"
      >
      // 與此同時,臺為li 新增了 v-for 指令來遍歷 arr 這個陣列,陣列裡面存放-文章列表, 文章編寫, 文章分類,三個條目。對應js 的 return 下的arr:[]程式碼。
        {{ item }}  // 為陣列item編寫模板語法,讓其顯示到頁面上面
      </li>
    </ul>
  // 最後配置路由容器
    <router-view></router-view>
//底部文章管理的模組
    <ul class="footer">
      <li>
        <div class="icon"></div>
        <div>文章管理</div>
      </li>
      <li>
        <div class="icon"></div>
        <div>文章管理</div>
      </li>
      <li>
        <div class="icon"></div>
        <div>文章管理</div>
      </li>
    </ul>
  </div>
</template>

接下來為元素和標籤配置樣式 編寫css程式碼

<style  scoped>
.container {
  display: flex;
  flex-direction: column;
  position: absolute;
  top: 0;
  left: 0;
  right: 20px;
  bottom: 0;
  padding-top: 100px;
  padding-bottom: 60px;
}

.container .page-title {
  /* display: flex; */
  justify-content: space-between;
  align-items: center;
  position: fixed;
  top: 0;
  left: 0;
  background: rgb(100, 108, 252);
  color: #ffffff;
  width: 100%;
  height: 40px;
  line-height: 40px;
  text-align: center;
  z-index: 1;
  padding: 0 10px;
  box-sizing: border-box;
}

.container .page-title #goBack {
  color: #ffffff;
  border: 2px solid #aaa;
  border-top-left-radius: 20px;
  border-top-right-radius: 20px;
  border-bottom-left-radius: 20px;
  border-bottom-right-radius: 20px;
  height: 30px;
  line-height: 30px;
  padding: 0 10px;
}

.container .page-title #save {
  color: #ffffff;
  border: 2px solid #aaa;
  border-top-left-radius: 20px;
  border-top-right-radius: 20px;
  border-bottom-left-radius: 20px;
  border-bottom-right-radius: 20px;
  height: 30px;
  line-height: 30px;
  padding: 0 10px;
}

.container .page-title {
  position: fixed;
  top: 0;
  left: 0;
  background: rgb(100, 108, 252);
  color: #ffffff;
  width: 100%;
  height: 40px;
  line-height: 40px;
  text-align: center;
  z-index: 1;
}

.container .page-tab {
  position: fixed;
  top: 40px;
  left: 20px;
  width: 80%;
  padding: 0 10px;
  display: flex;
  /* justify-content: space-between; */
  /* align-items: center; */
  background: #ffffff;
  border-bottom: 1px solid blue;
  z-index: 1;
}

.container .page-tab li {
  flex: 1;
  height: 40px;
  line-height: 40px;
  text-align: center;
  font-size: 14px;
}

.container .page-tab li.active {
  color: #ffffff;
  background: red;
}

.container .page-tab li:nth-child(2) {
  border-left: 1px solid #ddd;
  border-right: 1px solid #ddd;
}

.container .footer {
  position: fixed;
  bottom: 0;
  left: 0;
  display: flex;
  width: 100%;
  height: 60px;
  background: rgb(100, 108, 252);
  color: #ffffff;
  font-size: 12px;
  font-weight: bold;
}

.container .footer li {
  flex: 1;
  display: flex;
  margin-right: 80px;
  flex-direction: column;
  justify-content: space-around;
  align-items: center;
}

.container .footer li .icon {
  width: 25px;
  height: 25px;
  background: #aaaaaa;
  border-radius: 50%;
}

.container .footer li:first-child .icon {
  width: 25px;
  height: 25px;
  border-radius: 50%;
  background-image: url(../assets/icons-36-black.png);
  background-position: -867px -5px;
}

.container .footer li:nth-child(2) .icon {
  width: 25px;
  height: 25px;
  border-radius: 50%;
  background-image: url(../assets/icons-36-black.png);
  background-position: -939px -5px;
}

.container .footer li:last-child .icon {
  width: 25px;
  height: 25px;
  border-radius: 50%;
  background-image: url(../assets/icons-36-white.png);
  background-position: -580.5px -5px;
}
</style>

緊接著編寫js 為他執行動作- 程式碼

<script>
export default {
  data() {
    return {
      arr: ["文章列表", "文章編寫", "文章分類"], // 這裡對應上述的 <li v-for = "(item,index) in arr" :key=index >
      currentItem: "文章列表",
      btnVisible: false,
    };
  },
  mounted() {
    console.log(this.$route); // 在這裡用控制檯輸入當前路由路徑。
  },
  computed: {
    currentPath() {
      return this.$route.path;
    },// 計算屬性,對應上述的v-show="currentPath === '/jinengDetail'" ,判斷當前的路由路徑。 
    
  },
  methods: {
    changeItem(item) {
      this.currentItem = item;
    },
    //  methods對應上述的  @click="changeItem(item)" 點選條目的事件,更換item顏色與選中狀態。
    toList() {
      this.$router.push({ path: "/jinenglist" });
    },
  },
  watch: {
    // $route (value) {
    //     console.log('監聽router', value)
    //     if (value.path === '/jinengList') {
    //         this.btnVisible = false
    //     } else {
    //         this.btnVisible = true
    //     }
    // }
  },
};
</script>

到此頁面的顯示效果為:
在這裡插入圖片描述

4.編寫中部列表資料程式碼

HTML程式碼
<template>
  <div class="list-container">
    <div class="search-box">
      <div class="input-icon"></div>
      <input type="text" />
    </div>
    <ul class="content-box">
      <li v-for="(item, index) in arr" :key="index" @click="toDetail(item)">
        <div class="title">{{ item.title }}</div>
        <div>{{ item.userName }} 釋出於:{{ item.updateTime }}</div>
        <div class="item-icon"></div>
      </li>
    </ul>
    <!-- <router-view /> -->
  </div>
</template>

css程式碼:

<style  scoped>
.list-container {
  position: relative;
  flex: 1;
}

.list-container .search-box {
  position: relative;
  display: flex;
  justify-content: center;
  align-items: center;
  width: 100%;
  margin-left: 10px;
  height: 40px;
  background: #aaaaaa;
}

.list-container .search-box .input-icon {
  position: absolute;
  top: 50%;
  left: 20px;
  width: 25px;
  height: 25px;
  margin-top: -12.5px;
  background: #ddd;
  border-radius: 50%;
  background-image: url("../assets/icons-36-white.png"); 
	/* 這裡的 background-image 語句後面的路徑 需要注意的是 ../ 表示 上一級的目錄。*/
  background-position: -1225px -5px;
}

.list-container .search-box input {
  box-sizing: border-box;
  width: 100%;
  height: 35px;
  border-top-left-radius: 20px;
  border-top-right-radius: 20px;
  border-bottom-left-radius: 20px;
  border-bottom-right-radius: 20px;
  outline: none;
  border: 2px solid #333333;
  padding-left: 40px;
}

.list-container .content-box {
  width: 100%;
  flex: 1;
  overflow: auto;
}

.list-container .content-box li {
  position: relative;
  width: 90%;
  height: 80px;
  border-bottom: 1px solid #ddd;
  padding: 0 0px;
  box-sizing: border-box;
}

.list-container .content-box li .item-icon {
  position: absolute;
  top: 50%;
  right: 0px;
  width: 25px;
  height: 25px;
  margin-top: -12.5px;
  background: #aaaaaa;
  border-radius: 50%;
  background-image: url("../assets/icons-36-white.png");
  background-position: -220px -5px;
}

.list-container .content-box li .title {
  font-weight: bold;
  height: 40px;
  line-height: 40px;
}
</style>

js程式碼: 這裡需要注意的是 引入jQuery檔案需要在專案中配置,
配置語句 跳出控制檯輸入:npm install jquery --save 即可引入 jQuery,然後在頁面中的script下輸入 import $ from “jquery” 即可使用jQuery的一些語法和程式碼。

npm install jquery --save
<script>
import $ from "jquery";// 這裡需要注意的是 引入jQuery檔案需要在專案中配置,
//配置語句 跳出控制檯輸入:npm install jquery --save 即可引入 jQuery。
//然後在頁面中的script下輸入    即可使用jQuery的一些語法和程式碼。
import $ from "jquery"
export default {
  data() {
    return {
      arr: [], // 這裡用於顯示呼叫介面成功後傳回來的資料。
    };
  },
  mounted() {
  // 在vue中寫jQuery程式碼需要在 mounted中編寫。
    $.ajax({    
      url: "http://192.168.3.77:3000/api/demo/getList", //請求地址,這裡是老師給的伺服器預設地址,這個介面已經有資料了。
      method: "get",// 請求方式 為get請求
      data: {}, // 這裡的data是用來顯示請求成功後取回來的資料用於顯示。
      dataType: "json", // 請求的資料型別為 json,json解析。
      success: (res) => {  // 請求成功後,把請求的資料 res 作為引數傳入 。
        console.log(res);// 在控制檯中輸出調取成功後的資料。
        this.arr = res;// 把請求成功後的資料獲取到後,顯示到  data(){} 中 return下的arr陣列當中。 
      },
    });
  },
  methods: {
    toDetail(data) {
      console.log(data);
      this.$router.push({ path: "/jinengDetail", query: data });
    },
  },
};
</script>

至此,列表文章的模組就有資料了。執行效果圖:
在這裡插入圖片描述

5.編寫詳情頁的程式碼

html

<template>
  <div class="wrapper">
    <ul class="content-box">
      <li>
        <div>作者:</div>
        <input id="auther" v-model="detailObj.userName" type="text" />
      </li>
      <!-- v-model 表示雙向繫結,用於在輸入框中顯示主頁面點選後傳回來的資料顯示。 -->
      <li>
        <div>標題:</div>
        <input id="detailTitle" v-model="detailObj.title" type="text" />
      </li>
      <li>
        <div>內容:</div>
        <textarea
          v-model="detailObj.detailInfo"
          id="remark"
          name=""
          cols="30"
          rows="10"
        ></textarea>
      </li>
    </ul>
    <router-view />
  </div>
</template>

國際慣例,配置css程式碼,只要有html程式碼 要設定樣式的話就要寫 css程式碼:

<style  scoped>
.content-box {
  padding: 10px;
}

.content-box li {
  display: flex;
  flex-direction: column;
}

.content-box li > div {
  height: 40px;
  line-height: 40px;
  color: #333333;
}

.content-box li input {
  flex: 1;
  height: 40px;
  border-top-left-radius: 10px;
  border-top-right-radius: 10px;
  border-bottom-left-radius: 10px;
  border-bottom-right-radius: 10px;
}

.content-box li textarea {
  border-top-left-radius: 10px;
  border-top-right-radius: 10px;
  border-bottom-left-radius: 10px;
  border-bottom-right-radius: 10px;
  outline: none;
  /* box-shadow: blue 5px; */
}
</style>

配置完css程式碼後的效果為:
在這裡插入圖片描述
最後是js程式碼:
這裡需要注意的是 url 地址的老師提供的預設地址,需要自己去找介面資料呼叫。

<script>
import $ from "jquery";

export default {
  data() {
    return {
      detailObj: {}, // 此處用於input框中顯示獲取到的資料。
    };
  },
  mounted() {
    console.log(window.location.href);// 顯示當前瀏覽器的訪問路徑 window.location.href。
    console.log(this.$route.query); // 控制檯輸出並獲取到當前的路由傳過來的資料。
    $.ajax({
      url: "http://192.168.3.77:3000/api/demo/detail",
      method: "get",
      data: { id: this.$route.query.id },  // data屬性: 獲取到id 當前的路由資料的id。
      dataType: "json",
      success: (res) => {
        console.log("detailData", res);
        this.detailObj = res;// 把資料傳給detailObj,返回資料。
      },
    });
  },
};
</script>

三、最後的最後不要忘記

在App.vue 根元件 中寫 路由容器程式碼 <router-view //>
否則頁面沒有任何資料!在這裡插入圖片描述


總結

1.二級路由children ,因為jinengHome這個元件是主頁面,jinnegDetail.vue 是二級頁面 ,jinnegList.vue與主頁面是同級的元件。

2.引入jQuery檔案需要在專案中配置,配置語句 跳出控制檯輸入:npm install jquery --save 即可引入 jQuery,然後在頁面中的script下輸入 import $ from “jquery” 即可使用jQuery的一些語法和程式碼。

3 url: “http://192.168.3.77:3000/api/demo/getList”, 的請求地址,這裡是老師給的伺服器預設地址,這個介面已經有資料了。method: 請求方式要為get請求。

4: success: (res) => { 是使用的箭頭函式來獲取資料,請求成功後,把請求的資料 res 作為引數傳入 this.arr = res;程式碼是把請求成功後的資料獲取到後,顯示到 data(){} 中 return下的arr陣列當中。

5:路由配置檔案path 為路徑 ,將其設定為 “/” 的話為跳轉到當前主頁面。


專案原始碼:連結:https://pan.baidu.com/s/1Jfz7DmgH9di1uua-bUl_qw
提取碼:pykn

最困難之時,就是我們離成功不遠之日。——凱撒

相關文章