vue腳手架

少侠gqk發表於2024-06-07

vue腳手架

1 vue腳手架的概念

Vue腳手架(Vue Scaffolding)是Vue.js**官方提供的一個工具,專門用於快速搭建單頁面應用(SPA)的專案結構。它透過命令列介面(CLI)提供了一套標準化的開發流程,包括專案初始化、自動化構建、本地開發伺服器、元件和外掛支援等功能,幫助開發者更加專注於業務邏輯的實現,提高開發效率。12

Vue腳手架是一個整合了專案初始化、自動化構建、本地開發伺服器、元件和外掛支援等功能的工具,旨在幫助開發者快速搭建Vue.js專案,提高開發效率

2 vue腳手架的建立

2.1 vue腳手架的安裝

-g 表示的全域性安裝

npm install -g @vue/cli

2.2 建立Vue腳手架工程

想把專案建立在哪裡,就在哪裡執行以下的命令

vue create xxx專案名

image

出現以下介面說明構建成功

進入專案執行命令執行程式

cd myvue
npm run serve

啟動成功後出現

image

訪問本地的http://localhost:8080/

image

關閉服務用Ctrl+C

2.3 Vue腳手架的檔案結構說明

image

3 修改預設配置

在main.js中定義一個方法 info() 此方法沒有呼叫 伺服器啟動報錯

這樣不方便開發

image

配置vue.config.js

新增:

lintOnSave:false

image

image

4 標籤的 ref屬性

4.1 ref介紹

可以透過ref獲取Dom元素

js中是透過document.getElementById("id")獲取Dom元素

在vue中可以使用ref來替換上面js獲取Dom元素

應用在html標籤上獲取的是Dmo元素,應用在元件標籤上的是元件例項物件(vc)

使用方法:

<h1 ref="xxx"></h1>或<元件 ref="xxx"></元件>
獲取 :this.$refs.xxx

4.1示範

編寫一個Person.vue元件,

<template>
    <div class="person">
        <h1>姓名:{{name}}</h1>
        <h1>年齡:{{age}}</h1>
    </div>
</template>
<script>
export default {
    name:"Person",
    data(){
        return{
            name:"gqk",
            age:18
        }
    }
}
</script>
<style>
    .person{
        background-color: pink;
    }
</style>

在App.vue中引入

<template>
  <div id="app">
    <h1 ref="title">{{msg}}</h1>
    <button ref="btn" @click="showDom">點選輸出Dom元素</button>
    <Person ref="person"></Person>
  </div>
</template>

<script>
import Person from './components/Person.vue' //匯入Person.vue
export default {
  name: 'App',
  components: {
   Person
  },
  data(){
    return{
      msg:"歡迎來到java05班學習",
    }
  },
  methods:{
    showDom(){//透過ref獲取dom元素或元件物件
      console.log(this.$refs.title)
      console.log(this.$refs.btn)
      console.log(this.$refs.person)
    }
  }
}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

點選按鈕觀察控制檯

image

5 props配置

讓元件接收外部傳遞過來的資料,從而達到元件複用的目的

Person.vue

<template>
    <div class="person">
        <h1>{{msg}}</h1>
        <h2>姓名:{{name}}</h2>
        <h2>性別:{{sex}}</h2>
        <h2>年齡:{{age+1}}</h2>
    </div>
</template>
<script>
export default {
    name:"Person",
    data(){
        return{
           msg:"個人簡介"
        }
    },
    props:['name','sex','age']

}
</script>
<style>
    .person{
        background-color: pink;
    }
</style>

App.vue

<template>
  <div id="app">
    <h1 ref="title">{{msg}}</h1>
    <button ref="btn" @click="showDom">點選輸出Dom元素</button>
    <Person ref="person" name="gqk" sex="男" :age="18"></Person>
  </div>
</template>

<script>
import Person from './components/Person.vue' 
export default {
  name: 'App',
  components: {
   Person
  },
  data(){
    return{
      msg:"歡迎來到java05班學習",
    }
  },
  methods:{
    showDom(){
      console.log(this.$refs.title)
      console.log(this.$refs.btn)
      console.log(this.$refs.person)
    }
  }
}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

image

除了以上配置還可以配置引數的型別,預設值

   props:{
        name:{
            type:String,
            require:true,
            default:"老王"
        },
        age:String,
        sex:"男"

    }

6 mixin混入

6.1 區域性混入

示範:

Person.vue中有一個方法

methods:{
    showInfo(){
        alert(this.name)
    }
}
<template>
    <div class="person">
        <h1>{{msg}}</h1>
        <h2 @click="showInfo">姓名:{{name}}</h2>
        <h2>性別:{{sex}}</h2>
        <h2>年齡:{{age+1}}</h2>
    </div>
</template>
<script>
export default {
    name:"Person",
    data(){
        return{
           msg:"個人簡介"
        }
    },
    props:{
        name:{
            type:String,
            require:true,
            default:"老王"
        },
        age:String,
        sex:"男"

    },
    methods:{
        showInfo(){
            alert(this.name)
        }
    }
}
</script>
<style>
    .person{
        background-color: pink;
    }
</style>

Student.vue中也有一個

methods:{
    showInfo(){
        alert(this.name)
    }
}
<template>
    <div class="stu">
        <h2 @click="showInfo">學生姓名:{{name}}</h2>
        <h2>學生簡介:{{info}}</h2>
    </div>
</template>
<script>
export default {
    name:"Stu",
    data(){
        return{
            name:"姜萌",
            info:"java05班學生"
        }
    },
    methods:{
        showInfo(){
            alert(this.name)
        }
    }
}
</script>
<style>

    .stu{
        background-color: green;
    }

</style>

當元件中有相同方法的時候可以對其進行抽取出來(一個公共的js程式碼)重複使用

在根目錄下建立一個mixin.js

export const hunhe={
    methods:{
        showInfo(){
            alert(this.name)
        }
    }
}

在模組中使用(Student.vue)

<template>
    <div class="stu">
        <h2 @click="showInfo">學生姓名:{{name}}</h2>
        <h2>學生簡介:{{info}}</h2>
    </div>
</template>
<script>
import { hunhe } from '@/mixin';
export default {
    name:"Stu",
    data(){
        return{
            name:"姜萌",
            info:"java05班學生"
        }
    },
    mixins:[hunhe]
  
}
</script>
<style>

    .stu{
        background-color: green;
    }

</style>

6.2 全域性混入

匯入一次可在所有元件中使用混入檔案。

在main.js中新增全域性混入

import Vue from 'vue'
import App from './App.vue'
import { hunhe } from './mixin'
Vue.config.productionTip = false
Vue.mixin(hunhe)
new Vue({
  render: h => h(App),
}).$mount('#app')


7 外掛

功能:用於增強Vue
本質:包含install方法的一個物件,install的第一個引數就是Vue,第二個以後的引數是外掛使用者傳遞的資料。

定義外掛

	物件.install=function(Vue,options){
		
		//1.新增全域性過濾器
		Vue.filter(...)
		
		//2.新增全域性指令
		Vue.directive(...)
		
		//3.配置全域性混入
		Vue.minxin(...)

		//4.新增例項方法
		Vue.prototype.xxx=function(){
		  .....
		}
		Vue.prototype.xxx=(...)=>{
		 ......
		}

    }

建立一個plugins.js檔案

export default{
    install(Vue,x,y,z){
        console.info("x: "+x)
        console.info("y: "+y)
        console.info("z: "+z)
        //全域性過濾器
        Vue.filter('mySlice',function(value){
            console.log(x+y+z)
            return value.slice(0,4)
        })
        //全域性混入
        Vue.mixin({
            data(){
                return{
                    x:100,
                    y:100
                }
            }
        })
        //給Vue原型上新增方法
        Vue.prototype.hello=()=>{
            alert("Hello Vue");
        }

    }
}

在main.js中使用外掛

import plugins from './plugins'
//使用外掛
Vue.use(plugins,1,2,3)

在vue中可以呼叫方法

<template>
    <div class="stu">
        <h2 >學生姓名:{{name}}{{x}}{{y}}</h2>
        <h2>學生簡介:{{info|mySlice}}</h2>
        <h2 @click="hello">學生說</h2>
    </div>
</template>
<script>
export default {
    name:"Stu",
    data(){
        return{
            name:"姜萌",
            info:"java05班學生"
        }
    },
}
</script>

8 反向代理

在解決ajax跨域問題時,後端人員經常會配置CORS解決跨域,但是作為前端,我們也可以透過自己的反向代理的方式解決跨域,這樣就不用麻煩後端開發人員。

先啟動後端伺服器:

image

啟動成功後:

image

編寫axios 前提下載安裝axios(npm i axios)

<template>
    <div>
        <button @click="getStuList">查詢全部學生</button>
    </div>
</template>
<script>
import axios from 'axios'
export default {
    name:"Stu",
    methods:{
        getStuList(){//傳送ajax請求
            axios.get("http://localhost:5000/students").then(
                response=>{
                    console.log("請求成功...",response.data);
                },
                error=>{
                    console.log("請求失敗...",error.message)
                }
            )
        }
    }
}
</script>
<style>

</style>

直接請求報錯(跨域問題)

image

會發現,產生了跨域問題,接下來我們用以下兩種方式解決跨域

8.1 方式一

如果你的前端應用和後端 API 伺服器沒有執行在同一個主機上,你需要在開發環境下將 API 請求代理到 API 伺服器。這個問題可以透過 vue.config.js 中的 devServer.proxy 選項來配置。

devServer.proxy 可以是一個指向開發環境 API 伺服器的字串:

module.exports = {
  devServer: {
    proxy: 'http://localhost:5000'
  }
}

將原請求路徑更改為以下

   getStuList(){//傳送ajax請求
            axios.get("http://localhost:8080/students").then(
                response=>{
                    console.log("請求成功...",response.data);
                },
                error=>{
                    console.log("請求失敗...",error.message)
                }
            )
        }

image

8.2 方式二

如果你想要更多的代理控制行為,也可以使用一個 path: options 成對的物件

配置vue.config.js

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  transpileDependencies: true,
  lintOnSave:false,
  // devServer:{
  //   proxy:"http://localhost:5000"
  // }
  devServer: {
    proxy: {
      '/stu': {
        target: 'http://localhost:5000',
        ws: true,
        changeOrigin: true,
        pathRewrite:{"^/stu":""}
      },
      '/car': {
        target: 'http://localhost:5001',
        changeOrigin: true,
        pathRewrite:{"^/car":""}
      }
    }
  }
})

傳送axios

<template>
    <div>
        <button @click="getStuList">查詢全部學生</button>
        <button @click="getCarList">查詢汽車資訊</button>
    </div>
   
</template>
<script>
import axios from 'axios'
export default {
    name:"Stu",
    methods:{
        getStuList(){//傳送ajax請求
            axios.get("http://localhost:8080/stu/students").then(
                response=>{
                    console.log("請求成功...",response.data);
                },
                error=>{
                    console.log("請求失敗...",error.message)
                }
            )
        },
        getCarList(){//傳送ajax請求
            axios.get("http://localhost:8080/car/cars").then(
                response=>{
                    console.log("請求成功...",response.data);
                },
                error=>{
                    console.log("請求失敗...",error.message)
                }
            )
        },
    }
}
</script>
<style>

</style>

image

9 路由

9.1 路由簡介

服務端路由指的是伺服器根據使用者訪問的 URL 路徑返回不同的響應結果。當我們在一個傳統的服務端渲染的 web 應用中點選一個連結時,瀏覽器會從服務端獲得全新的 HTML,然後重新載入整個頁面。

然而,在單頁面應用中,客戶端的 JavaScript 可以攔截頁面的跳轉請求,動態獲取新的資料,然後在無需重新載入的情況下更新當前頁面。這樣通常可以帶來更順滑的使用者體驗,尤其是在更偏向“應用”的場景下,因為這類場景下使用者通常會在很長的一段時間中做出多次互動。

9.1 路由的簡單使用

安裝vue-router

注意,在2022年2月7日以後,vue-router的預設版本為4版本,並且:Vue-router3才能再Vue2中使用

npm i vue-router@3
使用vue-router

建立一個叫router的資料夾,並建立index.js,我們建立並暴露一個路由器VueRouter

import VueRouter from 'vue-router'
export default new VueRouter({
    routes:[
    ]
})

main.js中引入VueRouter並use,然後配置router

import Vue from 'vue'
import App from './App.vue'
import VueRouter from 'vue-router'
import router from './router/index'
Vue.config.productionTip = false

Vue.use(VueRouter)
new Vue({
  render: h => h(App),
  router:router
}).$mount('#app')

src下建立views

準備兩個元件:Stu.vue|Class.vue

<template>
    <div>
        <h2>我是Stu內容</h2>
    </div>
</template>
<script>
export default {
    name:"Stu",
}
</script>
<style>

</style>
<template>
    <div>
        <h2>我是Class內容</h2>
    </div>
</template>
<script>
export default {
    name:"Class"
}
</script>
<style>

</style>

路由器中配置路由陣列routes 它裡面包含很多路由。

import VueRouter from 'vue-router'
import Stu from '../views/Stu'
import Class from '../views/Class'
export default new VueRouter({
    routes:[
        {
            path:"/stu",
            component:Stu
        },{
            path:"/class",
            component:Class
        }
    ]
})

App.vue使用路由

<template>
  <div id="app">
    <img alt="Vue logo" src="./assets/logo.png">
    <div>
        <!-- 指定元件存放的位置 -->
      <router-view></router-view>
    </div>
    <router-link class="test" active-class="active" to="/stu">學生管理</router-link>
    <router-link class="test" active-class="active" to="/class">班級管理</router-link>
  </div>
</template>
<script>
export default {
  name: 'App',
  components: {
    
  }
}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
.test{
  background-color: skyblue;
  height: 100px;
  width: 150px;
  display: inline-block;
  margin-left: 20px;
  line-height: 100px;
  text-decoration: none;
}
.active{
  background-color: red;
}
</style>

點選學生管理,顯示我是Stu內容,點選班級管理顯示我是Class內容(區域性重新整理的)

image

相關文章