vue2
65
总安装量
65
周安装量
#3377
全站排名
安装命令
npx skills add https://github.com/teachingai/full-stack-skills --skill vue2
Agent 安装分布
opencode
42
claude-code
38
codex
37
gemini-cli
36
github-copilot
32
cursor
29
Skill 文档
Vue 2 å¼åæå
æ¦è¿°
æ¬æè½æä¾ Vue 2.x æ¡æ¶ç宿´å¼åæåï¼å æ¬ Options APIãç»ä»¶ç³»ç»ãè·¯ç±ç®¡çãç¶æç®¡çï¼Vuexï¼ãçå½å¨æçæ ¸å¿æ¦å¿µåæä½³å®è·µã
æ ¸å¿ç¹æ§
1. Options API
Vue 2 ä½¿ç¨ Options API ç»ç»ç»ä»¶ä»£ç ã
åºæ¬ç»æï¼
<template>
<div>
<p>{{ message }}</p>
<p>Count: {{ count }}</p>
<button @click="increment">Increment</button>
</div>
</template>
<script>
export default {
name: 'Counter',
data() {
return {
message: 'Hello Vue 2',
count: 0
}
},
computed: {
doubleCount() {
return this.count * 2
}
},
watch: {
count(newVal, oldVal) {
console.log(`count changed from ${oldVal} to ${newVal}`)
}
},
methods: {
increment() {
this.count++
}
},
mounted() {
console.log('Component mounted')
}
}
</script>
2. ååºå¼æ°æ®
dataï¼å®ä¹ååºå¼æ°æ®
data() {
return {
message: 'Hello',
count: 0,
user: {
name: 'Vue',
age: 2
}
}
}
注æäºé¡¹ï¼
- 使ç¨
this.$setæ·»å æ°å±æ§ - 使ç¨
Vue.setæthis.$setä¿®æ¹æ°ç»ç´¢å¼
3. 计ç®å±æ§åçå¬å¨
计ç®å±æ§ï¼
computed: {
fullName() {
return `${this.firstName} ${this.lastName}`
}
}
çå¬å¨ï¼
watch: {
// ç®åçå¬
count(newVal, oldVal) {
// ...
},
// 深度çå¬
user: {
handler(newVal, oldVal) {
// ...
},
deep: true
}
}
4. ç»ä»¶å¼å
ç»ä»¶å®ä¹ï¼
<template>
<div>
<h3>{{ title }}</h3>
<p>{{ content }}</p>
</div>
</template>
<script>
export default {
name: 'MyComponent',
props: {
title: {
type: String,
required: true
},
content: {
type: String,
default: ''
}
},
emits: ['update', 'delete'],
methods: {
handleClick() {
this.$emit('update', this.title)
}
}
}
</script>
ç»ä»¶éä¿¡ï¼
- Propsï¼ç¶ â å
$emitï¼å â ç¶$parent/$childrenï¼ç¶åç»ä»¶ç´æ¥è®¿é®$refsï¼è®¿é®åç»ä»¶å®ä¾- Vuexï¼å ¨å±ç¶æç®¡ç
- EventBusï¼äºä»¶æ»çº¿
5. è·¯ç±ç®¡çï¼Vue Routerï¼
åºæ¬é ç½®ï¼
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
const routes = [
{
path: '/',
component: () => import('./views/Home.vue')
},
{
path: '/about',
component: () => import('./views/About.vue')
}
]
const router = new VueRouter({
mode: 'history',
routes
})
è·¯ç±ä½¿ç¨ï¼
<template>
<div>
<router-link to="/about">About</router-link>
<router-view />
</div>
</template>
<script>
export default {
methods: {
goToAbout() {
this.$router.push('/about')
}
},
mounted() {
console.log(this.$route.params)
}
}
</script>
6. ç¶æç®¡çï¼Vuexï¼
Store å®ä¹ï¼
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
count: 0
},
getters: {
doubleCount: state => state.count * 2
},
mutations: {
INCREMENT(state) {
state.count++
}
},
actions: {
increment({ commit }) {
commit('INCREMENT')
}
}
})
å¨ç»ä»¶ä¸ä½¿ç¨ï¼
<script>
import { mapState, mapGetters, mapActions } from 'vuex'
export default {
computed: {
...mapState(['count']),
...mapGetters(['doubleCount'])
},
methods: {
...mapActions(['increment'])
}
}
</script>
7. çå½å¨æé©å
export default {
beforeCreate() {
// å®ä¾åå§åä¹åï¼æ°æ®è§æµä¹å
},
created() {
// å®ä¾åå»ºå®æï¼æ°æ®è§æµå®æ
},
beforeMount() {
// æè½½å¼å§ä¹å
},
mounted() {
// æè½½å®æ
},
beforeUpdate() {
// æ°æ®æ´æ°æ¶ï¼DOM æ´æ°ä¹å
},
updated() {
// DOM æ´æ°å®æ
},
beforeDestroy() {
// å®ä¾éæ¯ä¹å
},
destroyed() {
// å®ä¾éæ¯å®æ
}
}
æä½³å®è·µ
1. 代ç ç»ç»
- 使ç¨åæä»¶ç»ä»¶ï¼.vueï¼
- åçæåç»ä»¶
- ä½¿ç¨ mixins å¤ç¨é»è¾
2. æ§è½ä¼å
- 使ç¨
v-ifåv-showåçéæ© - 使ç¨
keyä¼åå表渲æ - æå 载路ç±ç»ä»¶
- 使ç¨
Object.freeze()å»ç»å¤§å¯¹è±¡
3. ç»ä»¶éä¿¡
- ä¼å ä½¿ç¨ Props å Events
- å¤æç¶æä½¿ç¨ Vuex
- é¿å
è¿åº¦ä½¿ç¨
$parentå$children
4. ååºå¼æ³¨æäºé¡¹
// æ·»å æ°å±æ§
this.$set(this.user, 'age', 25)
// ä¿®æ¹æ°ç»ç´¢å¼
this.$set(this.items, 0, newItem)
// ä¿®æ¹æ°ç»é¿åº¦
this.items.splice(newLength)
常ç¨å·¥å ·åæä»¶
- Vue CLIï¼é¡¹ç®èææ¶
- Vue Routerï¼è·¯ç±ç®¡ç
- Vuexï¼ç¶æç®¡ç
- Element UIï¼UI ç»ä»¶åº
- Ant Design Vueï¼UI ç»ä»¶åº
- Axiosï¼HTTP 客æ·ç«¯
ç¤ºä¾ Prompt
- “ä½¿ç¨ Vue 2 å建ä¸ä¸ªè®¡æ°å¨ç»ä»¶”
- “å¦ä½å¨ Vue 2 ä¸ä½¿ç¨ Vuex è¿è¡ç¶æç®¡çï¼”
- “å建ä¸ä¸ª Vue 2 项ç®ï¼ä½¿ç¨ Vue CLI”
- “Vue 2 ççå½å¨æé©åæåªäºï¼”
- “å¦ä½å¨ Vue 2 ä¸å®ç°ç»ä»¶éä¿¡ï¼”