《Asp.Net Core3 + Vue3入坑教程》 - Vue 2.使用Ant Design of Vue編寫頁面 & vue-router 初試

Iannnnnnnnnnnnn發表於2021-03-09

簡介

《Asp.Net Core3 + Vue3入坑教程》 此教程適合新手入門或者前後端分離嘗試者。可以根據圖文一步一步進操作編碼也可以選擇直接檢視原始碼。每一篇文章都有對應的原始碼

目錄

《Asp.Net Core3 + Vue3入坑教程》系列教程目錄

Asp.Net Core後端專案

  1. 後端專案搭建與Swagger配置步驟
  2. 配置CROS策略解決跨域問題
  3. AutoMapper & Restful API & DI
  4. EF Core & Postgresql
  5. .Net Core 3升級成 .Net 5 & JWT
  6. (推薦)異常處理與UserFriendlyException
  7. ...

Vue3 前端專案

  1. 使用vue-cli建立vue專案
  2. (本文)使用Ant Design of Vue編寫頁面 & vue-router 初試
  3. (暫未發表敬請期待...)將Antd導航選單與vue-router繫結
  4. (暫未發表敬請期待...) 儲存使用者登入狀態vuex初試

本文簡介

本文為《Asp.Net Core3 + Vue3入坑教程》系列教程的前端第二篇 - 使用Ant Design of Vue編寫頁面 & vue-router 初試。本文接著上文《使用vue-cli建立vue專案》新建的simple-vue的基礎上將使用Ant Design of Vue建立簡單頁面,並結合vue-router實現頁面之間的簡單跳轉,具體效果如下:

Ant Design of Vue 官方文件 https://2x.antdv.com/docs/vue/getting-started-cn

安裝Vetur外掛

Vetur外掛簡介 https://marketplace.visualstudio.com/items?itemName=octref.vetur

引入ant-design-vue依賴

在終端執行命令:

yarn add ant-design-vue@next

調整main.js將ant-design-vue全域性引入

程式碼如下:


import { createApp } from 'vue'
import App from './App.vue'
import Antd from 'ant-design-vue';
import 'ant-design-vue/dist/antd.css';

createApp(App).use(Antd).mount('#app')

在 components 資料夾下新建檔案 Home.vue

從官網複製的 https://www.antdv.com/components/layout-cn/

程式碼如下:

<template>
  <a-layout style="min-height: 100vh">
    <a-layout-sider v-model:collapsed="collapsed" collapsible>
      <div class="logo" />
      <a-menu theme="dark" v-model:selectedKeys="selectedKeys" mode="inline">
        <a-menu-item key="1">
          <pie-chart-outlined />
          <span>Option 1</span>
        </a-menu-item>
        <a-menu-item key="2">
          <desktop-outlined />
          <span>Option 2</span>
        </a-menu-item>
        <a-sub-menu key="sub1">
          <template #title>
            <span>
              <user-outlined />
              <span>User</span>
            </span>
          </template>
          <a-menu-item key="3">Tom</a-menu-item>
          <a-menu-item key="4">Bill</a-menu-item>
          <a-menu-item key="5">Alex</a-menu-item>
        </a-sub-menu>
        <a-sub-menu key="sub2">
          <template #title>
            <span>
              <team-outlined />
              <span>Team</span>
            </span>
          </template>
          <a-menu-item key="6">Team 1</a-menu-item>
          <a-menu-item key="8">Team 2</a-menu-item>
        </a-sub-menu>
        <a-menu-item key="9">
          <file-outlined />
          <span>File</span>
        </a-menu-item>
      </a-menu>
    </a-layout-sider>
    <a-layout>
      <a-layout-header style="background: #fff; padding: 0" />
      <a-layout-content style="margin: 0 16px">
        <a-breadcrumb style="margin: 16px 0">
          <a-breadcrumb-item>User</a-breadcrumb-item>
          <a-breadcrumb-item>Bill</a-breadcrumb-item>
        </a-breadcrumb>
        <div :style="{ padding: '24px', background: '#fff', minHeight: '360px' }">
          Bill is a cat.
        </div>
      </a-layout-content>
      <a-layout-footer style="text-align: center">
        Ant Design ©2018 Created by Ant UED
      </a-layout-footer>
    </a-layout>
  </a-layout>
</template>
<script>
import {
  PieChartOutlined,
  DesktopOutlined,
  UserOutlined,
  TeamOutlined,
  FileOutlined,
} from '@ant-design/icons-vue';
import { defineComponent, ref } from 'vue';
export default defineComponent({
  name: 'Home',

  components: {
    PieChartOutlined,
    DesktopOutlined,
    UserOutlined,
    TeamOutlined,
    FileOutlined,
  },

  data() {
    return {
      collapsed: ref(false),
      selectedKeys: ref(['1']),
    };
  },
});
</script>
<style>
#components-layout-demo-side .logo {
  height: 32px;
  margin: 16px;
  background: rgba(255, 255, 255, 0.3);
}

.site-layout .site-layout-background {
  background: #fff;
}
[data-theme='dark'] .site-layout .site-layout-background {
  background: #141414;
}
</style>

在 components 資料夾下新建檔案 Login.vue

程式碼如下:

<template>
    <div class="login-container">
        <a-form
        layout="horizontal"
        :model="formState"
        @finish="handleFinish"
        @finishFailed="handleFinishFailed"
    >
        <a-form-item>
        <a-input v-model:value="formState.user" placeholder="Username">
            <template #prefix><UserOutlined style="color: rgba(0, 0, 0, 0.25)" /></template>
        </a-input>
        </a-form-item>
        <a-form-item>
        <a-input v-model:value="formState.password" type="password" placeholder="Password">
            <template #prefix><LockOutlined style="color: rgba(0, 0, 0, 0.25)" /></template>
        </a-input>
        </a-form-item>
        <a-form-item>
        <a-button
            type="primary"
            html-type="submit"
            :disabled="formState.user === '' || formState.password === ''"
        >
            Log in
        </a-button>
        </a-form-item>
        </a-form>
    </div>
</template>
<script>
import { UserOutlined, LockOutlined } from '@ant-design/icons-vue';
import { defineComponent, reactive } from 'vue';
export default defineComponent({
  name: 'Login',

  setup() {
    const formState = reactive({
      user: '',
      password: '',
    });

    const handleFinish = values => {
      console.log(values, formState);
    };

    const handleFinishFailed = errors => {
      console.log(errors);
    };

    return {
      formState,
      handleFinish,
      handleFinishFailed,
    };
  },

  components: {
    UserOutlined,
    LockOutlined,
  },
});
</script>

<style>
.login-container{
    position: absolute;
    left: 0;
    right: 0;
    top: 0;
    bottom: 0;
    margin:auto;
    height: 600px;
    width: 500px;
}
</style>

調整App.Vue

程式碼如下:

<template>
  <Home />
  <!-- <Login /> -->
</template>

<script>

import Home from './components/Home.vue'
// import Login from './components/Login.vue'

export default {
  name: 'App',
  components: {
    Home,
    // Login
  }
}
</script>

<style>

</style>

啟動網站

在終端執行命令:

yarn serve

成功看到效果

接下來我們解決路由問題,讓url開啟指定的頁面

vue-router 官方文件 https://next.router.vuejs.org/zh/introduction.html

安裝vue-router

在終端執行命令:

yarn add vue-router@next

調整main.js

程式碼如下:

import { createApp } from 'vue'
import App from './App.vue'
import Antd from 'ant-design-vue';
import  { createRouter, createWebHashHistory } from 'vue-router';
import 'ant-design-vue/dist/antd.css';

import Home from './components/Home.vue'
import Login from './components/Login.vue'

const routes = [
    { path: '/', component: Home },
    { path: '/login', component: Login },
  ]

// 建立路由例項並傳遞 `routes` 配置
// 你可以在這裡輸入更多的配置,但我們在這裡
// 暫時保持簡單
const router = createRouter({
    // 內部提供了 history 模式的實現。為了簡單起見,我們在這裡使用 hash 模式。
    history: createWebHashHistory(),
    routes, // `routes: routes` 的縮寫
  })

//建立並掛載根例項
//確保 _use_ 路由例項使
//整個應用支援路由。
createApp(App).use(Antd).use(router).mount('#app')

修改App.vue

這裡的 是最頂層的出口!上面路徑匹配到的元件將會在此渲染

程式碼如下:

<template>
      <router-view></router-view>
</template>

<script>

export default {
  name: 'App',
}
</script>

<style>

</style>

現在我們可以通過改變url開啟不同的元件

接下來我們來簡單嘗試路由的跳轉,在登入介面驗證成功之後能夠正確調整到綜合管理介面

因為我們在 setup 裡面沒有訪問 this,所以我們不能再直接訪問 this.$router 或 this.$route。作為替代,我們使用 useRouter 函式:
https://next.router.vuejs.org/zh/guide/advanced/composition-api.html

修改Login.vue 指令碼

程式碼如下:

<script>
import { UserOutlined, LockOutlined } from '@ant-design/icons-vue';
import { defineComponent, reactive } from 'vue';
import { useRouter } from 'vue-router'

export default defineComponent({

  setup() {
    const formState = reactive({
      user: '',
      password: '',
    });
    const router = useRouter()
    const handleFinish = values => {
       console.log(values, formState);
       router.push('/')
    };

    const handleFinishFailed = errors => {
      console.log(errors);
    };

    return {
      formState,
      handleFinish,
      handleFinishFailed,
    };
  },

  components: {
    UserOutlined,
    LockOutlined,
  },
});
</script>

再次啟動網站

在終端執行命令:

yarn serve

跳轉效果如下:

最後調整對程式碼進行整理,移動 Home.vue Login.vue 的位置,在scr資料夾下新建views資料夾,將上面兩個檔案移動至此目錄下

修改main.js

程式碼如下:

import { createApp } from 'vue'
import App from './App.vue'
import Antd from 'ant-design-vue';
import  { createRouter, createWebHashHistory } from 'vue-router';
import 'ant-design-vue/dist/antd.css';

import Home from './views/Home.vue'
import Login from './views/Login.vue'

const routes = [
    { path: '/', component: Home },
    { path: '/login', component: Login },
  ]

// 建立路由例項並傳遞 `routes` 配置
// 你可以在這裡輸入更多的配置,但我們在這裡
// 暫時保持簡單
const router = createRouter({
    // 內部提供了 history 模式的實現。為了簡單起見,我們在這裡使用 hash 模式。
    history: createWebHashHistory(),
    routes, // `routes: routes` 的縮寫
  })

//建立並掛載根例項
//確保 _use_ 路由例項使
//整個應用支援路由。
createApp(App).use(Antd).use(router).mount('#app')

總結

本文簡單的建立了兩個vue頁面,並且初試了vue-router,讓兩個簡單的頁面能夠實現跳轉。在下一節的內容中將會進一步使用vue-router,更多vue-router內容可以檢視 https://next.router.vuejs.org/zh/introduction.html

GitHub原始碼

https://github.com/Impartsoft/Simple_Vue/tree/main/simple-vue 1.antd

參考資料

Ant Design of Vue 官方文件 https://2x.antdv.com/docs/vue/getting-started-cn

vue-router 官方文件 https://next.router.vuejs.org/zh/introduction.html

相關文章