vue腳手架的使用 搭建vue腳手架環境 1.傻瓜式安裝node: 官網下載:https://nodejs.org/zh-cn/ 2.安裝cnpm: >: npm install -g cnpm --registry=https://registry.npm.taobao.org 3.安裝vue最新 ...
vue腳手架的使用
搭建vue腳手架環境
1.傻瓜式安裝node:
官網下載:https://nodejs.org/zh-cn/
2.安裝cnpm:
>: npm install -g cnpm --registry=https://registry.npm.taobao.org
3.安裝vue最新腳手架:
>: cnpm install -g @vue/cli
註:如果2、3步報錯,清除緩存後重新走2、3步
>: npm cache clean --force
創建腳手架環境的項目
"""
前提:在目標目錄新建luffy文件夾
>: cd 建立的luffy文件夾
>: vue create luffycity
"""
新建的vue項目目錄文件介紹
"""
├── luffycity
├── public/ # 項目共有資源
├── favicon.ico # 站點圖標
└── index.html # 主頁
├── src/ # 項目主應用,開發時的代碼保存
├── assets/ # 前臺靜態資源總目錄
├── css/ # 自定義css樣式
└── global.css # 自定義全局樣式
├── js/ # 自定義js樣式
└── settings.js # 自定義配置文件
└── img/ # 前臺圖片資源
├── components/ # 小組件目錄
├── views/ # 頁面組件目錄
├── App.vue # 根組件
├── main.js # 入口腳本文件
├── router
└── index.js # 路由腳本文件
store
└── index.js # 倉庫腳本文件
├── vue.config.js # 項目配置文件
└── *.* # 其他配置文件
"""
分析項目文件中的main.js文件
點擊查看代碼
/*
該文件是整個項目的入口文件
*/
//引入Vue
import Vue from 'vue'
//引入App組件,它是所有組件的父組件
import App from './App.vue'
//關閉vue的生產提示
Vue.config.productionTip = false
/*
關於不同版本的Vue:
1.vue.js與vue.runtime.xxx.js的區別:
(1).vue.js是完整版的Vue,包含:核心功能+模板解析器。
(2).vue.runtime.xxx.js是運行版的Vue,只包含:核心功能;沒有模板解析器。
2.因為vue.runtime.xxx.js沒有模板解析器,所以不能使用template配置項,需要使用
render函數接收到的createElement函數去指定具體內容。
*/
//創建Vue實例對象---vm
new Vue({
el:'#app',
//render函數完成了這個功能:將App組件放入容器中
render: h => h(App),
// render:q=> q('h1','你好啊')
// template:`<h1>你好啊</h1>`,
// components:{App},
}).$mount('#app') // .$mount('#app') 等價於上面的el:'#app',$mount詳見vue生命周期圖
vue.config.js配置文件
- 使用vue inspect > output.js可以查看到Vue腳手架的預設配置。
- 使用vue.config.js可以對腳手架進行個性化定製,詳情見:https://cli.vuejs.org/zh
ref屬性
- 被用來給元素或子組件註冊引用信息(id的替代者)
- 應用在html標簽上獲取的是真實DOM元素,應用在組件標簽上是組件實例對象(vc)
- 使用方式:
- 打標識:
<h1 ref="xxx">.....</h1>
或<School ref="xxx"></School>
- 獲取:
this.$refs.xxx
- 打標識:
props配置項
-
功能:讓組件接收外部傳過來的數據
-
傳遞數據(父傳給子):
<Demo name="xxx"/>
(子傳父,需要在父中優先定義一個方法傳給子,等子需要的時候調用方法,把數據傳給父) -
接收數據:
-
第一種方式(只接收):
props:['name']
-
第二種方式(限制類型):
props:{name:String}
-
第三種方式(限制類型、限制必要性、指定預設值):
props:{ name:{ type:String, //類型 required:true, //必要性 default:'老王' //預設值 } }
備註:props是只讀的,Vue底層會監測你對props的修改,如果進行了修改,就會發出警告,若業務需求確實需要修改,那麼請複製props的內容到data中一份,然後去修改data中的數據。
-
mixin(混入)
-
功能:可以把多個組件共用的配置提取成一個混入對象
-
使用方式:
第一步定義混合:
新建一個mixin.js,在裡面書寫組件共有的配置並將該文件暴露給外部export const hunhe { data(){....}, methods:{....} .... }
第二步使用混入:
(1)局部混入:先導入import {hunhe} from '文件位置',然後mixins:['hunhe',]
(2)全局混入:在main.js中導入,然後在main.js中書寫Vue.mixin(xxx)
,這樣所有的vc都有了
插件
-
功能:用於增強Vue
-
本質:包含install方法的一個對象,install的第一個參數是Vue,第二個以後的參數是插件使用者傳遞的數據。
-
定義插件:
在src文件下新建一個plugins.js(插件的js文件) export default{ install(Vue,option){ // 1. 添加全局過濾器 Vue.filter(....) // 2. 添加全局指令 Vue.directive(....) // 3. 配置全局混入(合) Vue.mixin(....) // 4. 添加實例方法 Vue.prototype.$myMethod = function () {...} Vue.prototype.$myProperty = xxxx } }
-
在main.js中使用插件:
Vue.use(plugins)
scoped樣式
- 作用:讓樣式在局部生效,防止衝突。因為組件的css樣式,會在組件引入時全部放在一起,組件內的重名的樣式名會根據引入順序後面覆蓋前面的
- 寫法:
<style scoped>
總結TodoList案例
-
組件化編碼流程:
(1).拆分靜態組件:組件要按照功能點拆分,命名不要與html元素衝突。
(2).實現動態組件:考慮好數據的存放位置,數據是一個組件在用,還是一些組件在用:
1).一個組件在用:放在組件自身即可。
2). 一些組件在用:放在他們共同的父組件上(狀態提升)。
(3).實現交互:從綁定事件開始。
-
props適用於:
(1).父組件 ==> 子組件 通信
(2).子組件 ==> 父組件 通信(要求父先給子一個函數)
-
使用v-model時要切記:v-model綁定的值不能是props傳過來的值,因為props是不可以修改的!
-
props傳過來的若是對象類型的值,修改對象中的屬性時Vue不會報錯,但不推薦這樣做。
webStorage
-
存儲內容大小一般支持5MB左右(不同瀏覽器可能還不一樣)
-
瀏覽器端通過 Window.sessionStorage 和 Window.localStorage 屬性來實現本地存儲機制。
-
相關API:
-
xxxxxStorage.setItem('key', 'value');
該方法接受一個鍵和值作為參數,會把鍵值對添加到存儲中,如果鍵名存在,則更新其對應的值。 -
xxxxxStorage.getItem('person');
該方法接受一個鍵名作為參數,返回鍵名對應的值。
-
xxxxxStorage.removeItem('key');
該方法接受一個鍵名作為參數,並把該鍵名從存儲中刪除。
-
xxxxxStorage.clear()
該方法會清空存儲中的所有數據。
-
-
備註:
- SessionStorage存儲的內容會隨著瀏覽器視窗關閉而消失。
- LocalStorage存儲的內容,需要手動清除才會消失。
xxxxxStorage.getItem(xxx)
如果xxx對應的value獲取不到,那麼getItem的返回值是null。JSON.parse(null)
的結果依然是null。
組件的自定義事件
-
一種組件間通信的方式,適用於:子組件 ===> 父組件
-
使用場景:A是父組件,B是子組件,B想給A傳數據,那麼就要在A中給B綁定自定義事件(事件的回調在A中)。
-
綁定自定義事件:
-
第一種方式,在父組件中:
<Demo @atguigu="test"/>
或<Demo v-on:atguigu="test"/>
-
第二種方式,在父組件中:
<Demo ref="demo"/> ...... mounted(){ this.$refs.xxx.$on('atguigu',this.test) this.$refs.xxx.$once('atguigu',this.test) //綁定自定義事件(一次性的) }
-
若想讓自定義事件只能觸發一次,可以使用
once
修飾符,或$once
方法。
-
-
在子組件中觸發自定義事件:
this.$emit('atguigu',數據)
-
在子組件中解綁自定義事件
this.$off('atguigu') | this.$off(['atguigu','demo'...])解綁多個 off括弧里不填解綁所有
-
組件上也可以綁定原生DOM事件,需要使用
native
修飾符。
- 註意:通過
this.$refs.xxx.$on('atguigu',回調)
綁定自定義事件時,回調要麼配置在methods中,要麼用箭頭函數,否則this指向會出問題!
全局事件匯流排(任意組件間的通信)(GlobalEventBus)
-
一種組件間通信的方式,適用於任意組件間通信。
-
安裝全局事件匯流排:
new Vue({ ...... beforeCreate() { Vue.prototype.$bus = this //安裝全局事件匯流排,$bus就是當前應用的vm }, ...... })
-
使用事件匯流排:
-
接收數據:A組件想接收數據,則在A組件中給$bus綁定自定義事件,事件的回調留在A組件自身。
methods(){ demo(data){......} } ...... mounted() { this.$bus.$on('xxxx',this.demo) }
-
提供數據:
this.$bus.$emit('xxxx',數據)
-
-
最好在beforeDestroy鉤子中,用$off去解綁當前組件所用到的事件。
消息訂閱與發佈(pubsub)
-
一種組件間通信的方式,適用於任意組件間通信。
-
使用步驟:
-
安裝pubsub:
npm i pubsub-js
-
引入:
import pubsub from 'pubsub-js'
-
接收數據:A組件想接收數據,則在A組件中訂閱消息,訂閱的回調留在A組件自身。
methods(){ demo(data){......} } ...... mounted() { this.pid = pubsub.subscribe('xxx',this.demo) //訂閱消息 }
-
提供數據:
pubsub.publish('xxx',數據)
-
最好在beforeDestroy鉤子中,用
PubSub.unsubscribe(pid)
去取消訂閱。
-
nextTick
- 語法:
this.$nextTick(回調函數)
- 作用:在下一次 DOM 更新結束後執行其指定的回調。
- 什麼時候用:當改變數據後,要基於更新後的新DOM進行某些操作時,要在nextTick所指定的回調函數中執行。
Vue封裝的過度與動畫
-
作用:在插入、更新或移除 DOM元素時,在合適的時候給元素添加樣式類名。
-
圖示:
-
寫法:
-
準備好樣式:
- 元素進入的樣式:
- v-enter:進入的起點
- v-enter-active:進入過程中
- v-enter-to:進入的終點
- 元素離開的樣式:
- v-leave:離開的起點
- v-leave-active:離開過程中
- v-leave-to:離開的終點
- 元素進入的樣式:
-
使用
<transition>
包裹要過度的元素,並配置name屬性:<transition name="hello" appear> // appear表示在瀏覽器刷新時也會出現動畫效果,不加是需要點擊按鈕才會觸發 <h1 v-show="isShow">你好啊!</h1> </transition>
-
備註:若有多個元素需要過度,則需要使用:
<transition-group>
,且每個元素都要指定key
值。 -
第三方的動畫樣式庫,https://animate.style/
-