## 官方網站
- [https://vue3js.cn/](https://vue3js.cn/)
## 注意事項
## 棄用樣式擊穿(使用 ::v-deep)
> \>>>和/deep/ combinator已經被棄用。使用::v-deep代替。
### 創建組件不要使用箭頭函數
> 在 createApp 方法創建組件內參數options里面不要使用箭頭函數,例如`created: () => console.log(this.a)`或`vm.$watch('a', newValue => this.myMethod())`
```js
// 錯誤的
createApp({
data() {
return {
a: 1
}
},
created: () => {
// `this` points to the vm instance
console.log('a is: ' + this.a) // => "a is: 1"
}
})
// 下面是正確的
createApp({
data() {
return {
a: 1
}
},
created() {
// `this` points to the vm instance
console.log('a is: ' + this.a) // => "a is: 1"
}
})
```
#### 生命周期
> 在2.x版本中,我看可以看到很多的生命周期,3.x的版本已經更新了

> 通過上面的圖片,移除了一些生命周期
#### 插入html值
> 我們通過 v-html 插入值得話,它很容易導致[XSS漏洞](https://en.wikipedia.org/wiki/Cross-site_scripting),那么得需要通過過濾下 script,官方出來方案為:如果有存在一個 \<script\> 標簽的都不進行渲染。這樣保證了不被攻擊了。
#### JavaScript 表達式
> 在雙花括號中,里面可以通過寫入表達式進行執行JavaScript
```
{{ number + 1 }}
{{ ok ? 'YES' : 'NO' }}
{{ message.split('').reverse().join('')
}}
```
#### 動態參數
> 也可以改變事件名稱,比如onclick 改成 mousedown
```html
<a v-bind:[attributeName]="url"> ... </a>
<a v-on:[eventName]="doSomething"> ... </a>
```
#### 計算屬性
> 計算屬性僅是getter,但是您也可以在需要時提供setter:
```
computed: {
fullName: {
// getter
get() {
return this.firstName + ' ' + this.lastName
},
// setter
set(newValue) {
const names = newValue.split(' ')
this.firstName = names[0]
this.lastName = names[names.length - 1]
}
}
}
```
#### 類和樣式綁定
- 寫法一
```
<div :class="{ active: isActive }"></div>
```
- 寫法二
```
<div
class="static"
:class="{ active: isActive, 'text-danger': hasError }"
></div>
```
- 寫法三
```
<div :class="classObject"></div>
data() {
return {
classObject: {
active: true,
'text-danger': false
}
}
}
```
- 寫法四:通過計算屬性或者說 方法
```
<div :class="classObject"></div>
data() {
return {
isActive: true,
error: null
}
},
computed: {
classObject() {
return {
active: this.isActive && !this.error,
'text-danger': this.error && this.error.type === 'fatal'
}
}
}
```
- 寫法5:
```
<div :class="[{ active: isActive }, errorClass]"></div>
```
- 寫法6:
```
const app = Vue.createApp({})
app.component('my-component', {
template: `
<p :class="$attrs.class">Hi!</p>
<span>This is a child component</span>
`
})
```
- 寫法7:多值情況
```
<div :style="{ display: ['-webkit-box', '-ms-flexbox', 'flex'] }"></div>
```
- 寫法8,不寫了
### for 循環
> 其他的都略過
#### 顯示篩選/排序結果1
> 通過計算屬性來返回排序
```
<li v-for="n in evenNumbers">{{ n }}</li>
```
```
data() {
return {
numbers: [ 1, 2, 3, 4, 5 ]
}
},
computed: {
evenNumbers() {
return this.numbers.filter(number => number % 2 === 0)
}
}
```
#### 顯示篩選/排序結果2
> 通過方法進行返回
```
<ul v-for="numbers in sets">
<li v-for="n in even(numbers)">{{ n }}</li>
</ul>
```
```
data() {
return {
sets: [[ 1, 2, 3, 4, 5 ], [6, 7, 8, 9, 10]]
}
},
methods: {
even(numbers) {
return numbers.filter(number => number % 2 === 0)
}
}
```
#### v-for 在一個 \<template\>
```
<ul>
<template v-for="item in items">
<li>{{ item.msg }}</li>
<li class="divider" role="presentation"></li>
</template>
</ul>
```
#### v-for 與 v-if
```
<li v-for="todo in todos" v-if="!todo.isComplete">
{{ todo }}
</li>
```
```
<ul v-if="todos.length">
<li v-for="todo in todos">
{{ todo }}
</li>
</ul>
<p v-else>No todos left!</p>
```
### 事件
#### 多個事件處理程序
```
<button @click="one($event), two($event)">
Submit
</button>
```
```
methods: {
one(event) {
// first handler logic...
},
two(event) {
// second handler logic...
}
}
```
#### 寫的順序與執行順序有關
> 注意了: 使用@click.prevent.self將阻止所有單擊,而@click.self.prevent只會阻止對元素本身的單擊。
#### 監聽事件(addEventListener)
> Vue還提供了.passive與addEventListener的passiveoption對應的修飾符。比如(進行監聽滾動對象):
```
<div @scroll.passive="onScroll">...</div>
```
> 注意了:==請勿將.passive和.prevent一起使用,因為.prevent它將被忽略,并且瀏覽器可能會向您顯示警告。請記住,.passive瀏覽器傳達你不想要阻止事件的默認行為。==
### 關鍵修飾符
> 注意:鍵盤按下在起來才會觸發修飾符,鍵盤的按下等操作,比如
```
<input @keyup.enter="submit" />
```
#### Vue為最常用的鍵提供別名:
- .enter
- .tab
- .delete (同時捕獲“刪除”和“退格”鍵)
- .esc
- .space
- .up
- .down
.- left
- .right
### 系統修改鍵
> 僅當按下相應的修飾鍵時,才可以使用以下修飾符觸發鼠標或鍵盤事件偵聽器:
- .ctrl
- .alt
- .shift
- .meta
- LOLKU
- 工具類
- form/formData
- form
- formData
- iframe
- 渲染數據,防止內存泄漏
- 獲取url(路由)參數
- 常用方法
- 失去焦點軟鍵盤頁面亂
- 判斷數據類型
- 瀏覽器全屏
- 動態插入css
- 隨機生成自定義長度位數數字
- 驗證判斷
- localStorage 封裝存儲
- 格式化日期
- 計算兩個時間差
- 去除空格
- 將駝峰命名轉換為連字符
- 獲取dom屬性
- 深拷貝
- class操作
- 判斷是否打開瀏覽器控制臺
- 全國城市地區代碼表
- canvas合成工具
- 去除emoji表情符號
- 比較兩個對象屬性和內容(值)一致
- 微信結束頁面事件
- 正則匹配url替換域名
- 字符串拼接(渲染dom后傳值)
- 判斷是否是正則
- 日歷算法
- json 工具
- 是否支持webp格式
- h5底部輸入框被鍵盤遮擋問題
- php
- php 二級域名管理
- 單個或者多個域名跨域
- file_get_contents 正確使用
- fromData請求無法攜帶cookie
- 簡單的加密文件傳輸
- css
- 1px
- 滾動
- ios點擊有顏色
- 文本溢出省略號
- css動畫抖動
- 文本換行與不換行
- 阻止旋轉屏幕時自動調整字體大小
- vue
- vscode 調試
- 新技術
- vue-router 4.0
- vue3
- 基礎
- 試驗
- javascript
- 上傳問題
- 文件選中過,第二次再次選中不觸發change事件
- 上傳oss
- 后臺
- linux搭建服務
- 需安裝
- nginx
- 安裝
- nginx http 配置二級域名
- nginx https 配置二級域名
- 防止暴力破解
- 阿里申請免費https
- git
- 快速安裝
- 配置項
- node
- 安裝
- pm2
- mysql
- 安裝
- 創建、切換、查詢數據庫
- 常用命令
- cmake 編譯器
- redis
- 軟件下載
- git
- 百度git 記住密碼
- 經驗
- 上傳
- 軟件
- vscode
- 推薦插件
- 應用開發
- nwjs
- 入門
- package.json
- vue、react、angular 跑nwjs
- 打包
- 監聽屏幕
- 運行另一個.exe文件
- node應用
- electron
- 資料
- 安裝
- 實戰
- 崩潰日志報告
- electron-forge
- 托盤閃爍
- 開機自動啟動
- 消息通知
- 禁止默認事件
- 保證只有一個實例
- 打包且美化安裝界面
- 創建cli
- 添加Github徽章
- 自動更新
- docsify
- Lowdb存儲數據
- 備份、恢復、導入、導出
- 深度鏈接(協議)喚起Electron應用
- 說明
- 加載擴展插件
- 證書
- Sketch 插件
- 工作
- 宣傳文章地址
- api
- tinypng
- npm 插件
- fs封裝:fs-jetpack
- 判斷是否npm或yarn運行
- 字符串或緩沖區的gzip壓縮大小
- 克隆并修改RegExp實例
- 反轉對象的鍵/值
- http路由find-my-way
- dragula 拖拽(拖放)
- svga
- npm 腳手架搭建
- 項目
- 小工具
- svg轉圖片
- 日歷