VUE常見知識疑點問題總結
1.vue.js @click和v-on:click有什么區(qū)別?
沒有區(qū)別,@ 只是一個 v-on: 的縮寫,為了書寫方便。
Vue.js 為 v-bind 和 v-on 這兩個最常用的指令,提供了特定簡寫: v-bind 縮寫 <!-- 完整語法 --> <a v-bind:href="url" rel="external nofollow" rel="external nofollow" ></a> <!-- 縮寫 --> <a :href="url" rel="external nofollow" rel="external nofollow" ></a> v-on 縮寫 <!-- 完整語法 --> <a v-on:click="doSomething"></a> <!-- 縮寫 --> <a @click="doSomething"></a>
2.v-on和v-bind的區(qū)別
v-bind指令用于設置HTML屬性:v-bind:href 縮寫為 :href
<a :href="{undefined{url}}" rel="external nofollow" >aa</a>v-on 指令用于綁定HTML事件 :v-on:click 縮寫為 @click
<a @click="get()">aa</a>
3.v-if和v-show對比:
- v-if當條件為false的時候,壓根不會有對應的元素在DOm中。
- v-show當條件為false時,僅僅是將元素的dispaly屬性設置為none而已。
開發(fā)中如何選擇呢:
- 當需要再顯示與隱藏之間切片很頻繁的時,使用v-show
- 當只有一次切換時,使用v-if
4.關于<template>
請教了下別人,聽完解釋,有個基本概念,但是對于應用實踐,他告訴template是用來寫界面的,也沒毛病,繼續(xù)懵逼著,還是自己摸索下。

template 標簽在Vue實例綁定的元素內部是可以顯示template標簽中的內容,但是查看后臺的dom結構不存在template標簽。
如果template標簽不放在vue實例綁定的元素內部默認里面的內容不能顯示在頁面上,但是查看后臺dom結構存在template標簽。
<div id="app">
<!--此處的template標簽中的內容顯示并且在dom中不存在template標簽-->
<template>
<div>我是template</div>
<div>我是template</div>
</template>
</div>
<!--此處的template標簽中的內容在頁面中不顯示,但是在dom結構存在該標簽及內部結構-->
<!--因為template標簽天生不可見,它設置了display:none;屬性-->
<template id="tem">
<div id="div1">我是template</div>
<div>我是template</div>
</template>
<script src="node_modules/vue/dist/vue.js"></script>
<script>
let vm = new Vue({
el: "#app",
});
</script>vue實例綁定的元素內部的template標簽不支持v-show指令,即v-show="false"對template標簽來說不起作用。但是此時的template標簽支持v-if、v-else-if、v-else、v-for這些指令
<div id="app">
<template v-if="true">
<!--此時template標簽中的內容顯示在頁面上,但是看dom結構沒有template標簽-->
<div>我是template</div>
<div>我是template</div>
</template>
<div v-if="true">
<!--此時頁面上顯示div標簽中的內容,并且看dom結構存在最外面的div標簽-->
<div>我是template</div>
<div>我是template</div>
</div>
<!--此處會輸出6個‘我是template'并且dom結構中不存在template標簽-->
<template v-for="a in 3">
<div>我是template</div>
<div>我是template</div>
</template>
</div>
<script src="node_modules/vue/dist/vue.js"></script>
<script>
let vm = new Vue({
el: "#app",
});
</script>vue實例中的template屬性
將實例中template屬性值進行編譯,并將編譯后的dom替換掉vue實例綁定的元素,如果該vue實例綁定的元素中存在內容,這些內容會直接被覆蓋。
- 1)如果vue實例中有template屬性,會將該屬性值進行編譯,將編譯后的虛擬dom直接替換掉vue實例綁定的元素(即el綁定的那個元素);
- 2)template屬性中的dom結構只能有一個根元素,如果有多個根元素需要使用v-if、v-else、v-else-if設置成只顯示其中一個根元素;
- 3)在該屬性對應的屬性值中可以使用vue實例data、methods中定義的數據。
<!--此處頁面顯示hello-->
<div id="app"></div>
<!--此處template標簽必須在vue綁定的元素外面定義,并且在頁面中不顯示下面的template標簽中的內容-->
<template id="first">
<div v-if="flag">{{msg}}<div>
<div v-else>111<div>
</template>
<script src="./node_modules/vue/dist/vue.js"></script>
<script>
let vm = new Vue({
el:"#app",
data:{
msg:"hello",
flag:true
},
template:"#first"http://通過該屬性可以將自定義的template屬性中的內容全部替換app的內容,并且會覆蓋里面原有的內容,并且在查看dom結構時沒有template標簽
});
</script>上面的例子中html中的template標簽可以變成自定的標簽,如下。但是下面這種方式也可以將<abc></abc>標簽中的內容替換掉app元素,但是<abc></abc>標簽中的內容也會顯示在頁面上。所以此處利用template標簽來定義vue實例中需要設置的template屬性。
<abc id="first">
<div v-if="flag">{{msg}}<div>
<div v-else>111<div>
</abc>5. 認識Vue 的 export、export default、import
在ES6中,export與export default均可用于導出變量(含常量)、函數、類、文件、模塊等,然后在其它文件或模塊中通過import 變量(含常量)|函數|類|文件|模塊名的方式,將其導入,以便能夠對其進行使用。
一個模塊就是一個獨立的文件,該文件內部的內容,外部無法獲取。如果希望外部能夠讀取模塊內部的內容,比如某個變量,就必須使用export關鍵字導出該變量,然后在其它模塊中通過import方式導入使用。
//model1.js
export var author = "shouke"
export var addr = "sz"
// 等價寫法
var author = "shouke"
var addr = "sz"
export { author, addr }//model2.js
import { author } from "./model1"
import { addr } from "./model1"
一個js文件是可以有多個 export
但是一個js文件中只能有一個export default
6.let const var的區(qū)別
var是ES5提出的,let和const是ES6提出的
ES5中作用域有:全局作用域、函數作用域。沒有塊作用域的概念。
ES6(簡稱ES6)中新增了塊級作用域。塊作用域由 { } 包括,if語句和for語句里面的{ }也屬于塊作用域。
- const聲明的是常量,必須賦值
- 1)一旦聲明必須賦值,不能使用null占位。
- 2)聲明后不能再修改
- 3)如果聲明的是復合類型數據,可以修改其屬性
- let和var聲明的是變量,聲明之后可以更改,聲明時可以不賦值
- var允許重復聲明變量,后一個變量會覆蓋前一個變量。let和const在同一作用域不允許重復聲明變量,會報錯。
- var聲明的變量存在變量提升(將變量提升到當前作用域的頂部)。即變量可以在聲明之前調用,值為undefined。
- let和const不存在變量提升。即它們所聲明的變量一定要在聲明后使用,否則報ReferenceError錯。
- var不存在塊級作用域,不能跨函數訪問。
- let和const存在塊級作用域,不能跨塊訪問,也不能跨函數訪問。
7.Options API vs Composition API
字面上, 選項 API 與 組合 API,細品, 這反映了設計面向的改變:
1. 選項,誰的選項,關鍵在“誰”。誰?組件。也是 Vue2.x 的設計基礎。組件有什么,
有狀態(tài),有改變狀態(tài)的方法,有生命周期,還有組件和組件之間的關系。這種情況
下,“數據”要接受一定的“規(guī)矩”,“什么時候能做什么事”,“什么時候有什么表現”;
這個狀態(tài)下,開發(fā)模式像是“被動接受”。
2. 組合,什么組合,關鍵在“什么”。什么?數據。數據的組合。Vue3.x 設計重點變了,數
據變絕對的C了,現在去組件里串門,不用“守規(guī)矩”了,只需要說“我在 onMounted 的時
候要這樣這樣,你看著辦”,真只能的以“數據”為中心,沒人能管得了了,想去哪就去哪,
自然就靈活了
8.VUE3中watch和watchEffect的用法
watch和watchEffect都是監(jiān)聽器,但在寫法和使用上有所區(qū)別。
- watch可監(jiān)聽老舊值
- watchEffect監(jiān)聽新值
- watchEffect局限性,只能監(jiān)聽最新的變化,中間值不監(jiān)聽到
watch和watchEffect監(jiān)聽器在同一個頁面中都可以使用多次,對于分別監(jiān)聽多個變量的時候
1)watchEffect :
- 立即執(zhí)行,沒有惰性。
- 不需要手動傳入依賴
- 每次初始化時會執(zhí)行一次回調函數來自動獲取依賴
- 無法獲取到原值,只能得到變化后的值
watchEffect(()=>{
console.log(name.value)
})
function change(){
name.value = 'blue'
// age.value=1
// console.log(111)
}2)watch
- 具備一定的惰性。
- 參數可以拿到最新值和之前的值。
- 可以偵聽多個數據的變化,用一個偵聽器承載。
- 給 watch 第三個參數 添加
{ immediate:true }可以立即執(zhí)行,沒有惰性。
function changeDB(){
// obj.age = 22
// obj.xz.price = '22k'
obj.name='redred'
}
// 監(jiān)視reactive定義數據的某一個屬性
watch(()=> obj.name,(newVal,oldVal)=>{
console.log("有新名字拉~~",newVal)
console.log("原來的名字哦~",oldVal)
})9.VUE3中ref和reactive的區(qū)別
reactive 和 ref 都是用來定義響應式數據的 。reactive更推薦去定義復雜的數據類型 ref 更推薦定義基本類型。


如果在template里使用的是ref類型的數據, 那么Vue會自動幫我們添加.value
如果在template里使用的是reactive類型的數據, 那么Vue不會自動幫我們添加.value
Vue在解析數據之前, 會自動判斷這個數據是否是ref類型的, 如果是就自動添加.value, 如果不是就不自動添加.value
10.defineProps、defineEmits、defineExpose
defineProps獲取組件傳值
<template>
<h1>{{ msg }}</h1>
<div @click="clickThis">1111</div>
</template>
<script setup lang="ts">
defineProps<{ // 采用ts專有聲明,無默認值
msg: string,
num?: number
}>()
// 采用ts專有聲明,有默認值
interface Props {
msg?: string
labels?: string[]
}
const props = withDefaults(defineProps<Props>(), {
msg: 'hello',
labels: () => ['one', 'two']
})
defineProps({ // 非ts專有聲明
msg: String,
num: {
type:Number,
default: ''
}
})
</script>
<style scoped lang="less">
</style>defineEmits子組件向父組件事件傳遞
vue3.0中 在子組件中觸發(fā)父組件中的函數的技巧目前有兩個:defineEmits和useContext ,現在useContext 已經棄用。下面是defineEmits的示例:

defineExpose組件暴露自己的屬性
<template>
<div>子組件helloword.vue</div>
</template>
<script setup lang="ts">
import { ref } from 'vue'
const count = ref(123456)
defineExpose({
count
})
</script>
<style scoped lang="less">
</style><template>
<div @click="helloClick">父組件</div>
<helloword ref="hello"></helloword>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import helloword from './components/HelloWorld.vue'
const hello = ref(null)
const helloClick = () => {
console.log(hello.value.count) // 123456
}
</script>
<style lang="less" scoped>
</style>到此這篇關于VUE常見知識疑點問題總結的文章就介紹到這了,更多相關VUE常見知識疑點內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
vue3+vue-cli4中使用svg的方式詳解(親測可用)
最近在做個vue的項目,從各種github上的開源庫上借鑒開發(fā)方法,給大家分享下,這篇文章主要給大家介紹了關于vue3+vue-cli4中使用svg的相關資料,需要的朋友可以參考下2022-08-08
Django Vue實現動態(tài)菜單和動態(tài)權限
本文主要介紹了Django Vue實現動態(tài)菜單和動態(tài)權限,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-06-06

