v-bind:
v-on:
v-for:
v-model:
v-if/v-show:
beforeCreate()/created()
beforeMount()/mounted()
beforeUpdate()/updated()
beforeDestroyed()/destroyed()
Global Components:
Component Variables:
Single File Components
Vue.component('name-of-component', {});
const nameOfComponentObject = {};
<template> section - HTML
<script> section - JS
<style> section - CSS
npm install -g @vue/cli
vue create name_of_project
props
<template>
<div>
<ChildComponent :numbers="numbers" />
</div>
</template>
<script>
import ChildComponent from "./ChildComponent";
export default {
name: "ParentComponent",
data() {
return {
numbers: [1, 2, 3]
};
},
components: {
"ChildComponent": ChildComponent
}
};
</script>
<template>
<div>
<h2>{{ numbers }}</h2>
</div>
</template>
<script>
export default {
name: "ChildComponent",
props: ['numbers']
};
</script>
numbers
ParentComponent.vue
ChildComponent.vue
this.$emit('name-of-event', {});
<template>
<div>
<ChildComponent
:numbers="numbers"
@number-added="numbers.push($event)"
/>
</div>
</template>
<script>
import ChildComponent from "./ChildComponent";
export default {
name: "ParentComponent",
data() {
return {
numbers: [1, 2, 3]
};
},
components: {
"ChildComponent": ChildComponent
}
};
</script>
<template>
<div>
<h2>{{ numbers }}</h2>
<input v-model="number" type="number" />
<button @click="$emit('number-added', Number(number))">
Add new number
</button>
</div>
</template>
<script>
export default {
name: "ChildComponent",
props: {
numbers: Array
},
data() {
return {
number: 0
};
}
};
</script>
ParentComponent.vue
ChildComponent.vue
props
custom events
this.$emit('name-of-event', {});
<child-component
@name-of-event="triggerMethod">
</child-component>
EventBus = new Vue();
window.EventBus
import Vue from 'vue';
export const EventBus = new Vue();
import Vue from 'vue';
export const EventBus = new Vue();
<template>
<div>
<input v-model="number" type="number" />
<button @click="addNumber">
Add new number
</button>
</div>
</template>
<script>
import { EventBus } from "../event-bus.js";
export default {
name: "NumberSubmit",
data() {
return {
number: 0
};
},
methods: {
addNumber() {
EventBus.$emit("number-added", Number(this.number));
}
}
};
</script>
<template>
<div>
<h2>{{ numbers }}</h2>
</div>
</template>
<script>
import { EventBus } from "../event-bus.js";
export default {
name: "NumberDisplay",
data() {
return {
numbers: [1, 2, 3]
};
},
created() {
EventBus.$on("number-added", number => {
this.numbers.push(number);
});
}
};
</script>
NumberSubmit.vue
NumberDisplay.vue
event-bus.js
store = {
state: {
numbers: [1, 2, 3]
},
}
addNumber(number) {
this.state.numbers.push(number);
}
export const store = {
state: {
numbers: [1, 2, 3]
},
addNumber(newNumber) {
this.state.numbers.push(newNumber);
}
};
<template>
<div>
<h2>{{ storeState.numbers }}</h2>
</div>
</template>
<script>
import { store } from "../store.js";
export default {
name: "NumberDisplay",
data() {
return {
storeState: store.state
};
}
};
</script>
<template>
<div>
<input v-model="number" type="number" />
<button @click="addNumber">
Add new number
</button>
</div>
</template>
<script>
import { store } from "../store.js";
export default {
name: "NumberSubmit",
data() {
return {
number: 0
};
},
methods: {
addNumber() {
store.addNumber(Number(this.number));
}
}
};
</script>
store.js
NumberDisplay.vue
NumberSubmit.vue
store = {
state: {
numbers: [1, 2, 3]
},
addNumber(number) {
this.state.numbers.push(number);
}
}
store = { state: { numbers: [1, 2, 3] }, addNumber(number) { this.state.numbers.push(number); },
removeLastNumber() { this.state.numbers.pop(); },
reverseNumbers() { this.state.numbers.reverse(); } }
export const store = {
state: {
numbers: [1, 2, 3]
},
addNumber(newNumber) {
this.state.numbers.push(newNumber);
}
};
<template>
<div>
<h2>{{ storeState.numbers }}</h2>
</div>
</template>
<script>
import { store } from "../store.js";
export default {
name: "NumberDisplay",
data() {
return {
storeState: store.state
};
}
};
</script>
<template>
<div>
<input v-model="numberInput" type="number" />
<button @click="addNumber">
Add new number
</button>
</div>
</template>
<script>
import { store } from "../store.js";
export default {
name: "NumberSubmit",
data() {
return {
number: 0
};
},
methods: {
addNumber() {
store.addNumber(Number(this.number));
}
}
};
</script>
store.js
NumberDisplay.vue
NumberSubmit.vue
npm install vuex
Vue.use(Vuex);
import Vue from 'vue';
import Vuex from 'vuex';
const store = new Vuex.Store({
state,
mutations,
actions,
getters
});
new Vue({
el: '#app',
store,
render: h => h(App)
});
const state = {
numbers: [1, 2, 3]
}
const mutations = {
ADD_NUMBER(state, payload) {
state.numbers.push(payload);
}
}
const mutations = {
ADD_NUMBER(state, payload) {
state.numbers.push(payload);
}
}
state
payload
const mutations = {
ADD_NUMBER(state, payload) {
state.numbers.push(payload);
}
}
const actions = {
addNumber(context, number) {
context.commit('ADD_NUMBER', number);
}
}
const actions = {
addNumber(context, number) {
context.commit('ADD_NUMBER', number);
}
}
context
context.state
context.getters
context.commit
const actions = {
addNumber(context, number) {
context.commit('ADD_NUMBER', number);
}
}
const getters = {
getNumbers(state) {
return state.numbers;
}
}
state
const getters = {
getNumbers(state) {
return state.numbers;
}
}
const getters = {
getNumbers(state) {
return state.numbers;
}
}
GETTERS
STATE
this.$store
this.$store.state
this.$store.dispatch('nameOfAction')
this.$store.getters
this.$store.commit('nameOfMutation')
<template>
<div>
<h2>{{ getNumbers }}</h2>
</div>
</template>
<script>
export default {
name: "NumberDisplay",
computed: {
getNumbers() {
return this.$store.getters.getNumbers;
}
}
};
</script>
<template>
<div>
<input v-model="number" type="number" />
<button @click="addNumber">
Add new number
</button>
</div>
</template>
<script>
export default {
name: "NumberSubmit",
data() {
return {
number: 0
};
},
methods: {
addNumber() {
this.$store.dispatch("addNumber", Number(this.number));
}
}
};
</script>
NumberDisplay.vue
NumberSubmit.vue
const state = {
numbers: [1, 2, 3]
}
methods: {
addNumber() {
this.$store.dispatch('addNumber', Number(this.number));
}
}
NumberSubmit.vue
store.js
const actions = {
addNumber(context, number) {
context.commit('ADD_NUMBER', number);
}
}
5
store.js
const mutations = {
ADD_NUMBER(state, payload) {
state.numbers.push(payload);
}
}
5
[1,2,3]
computed: {
numbers() {
return this.$store.state.numbers
}
}
computed: {
numbers() {
return this.$store.getters.numbers
}
}
methods: {
addNumber() {
this.$store.dispatch('addNumber', Number(this.number));
}
}
computed: mapState({
'numbers'
})
methods: mapActions({ 'addNumber'
})
computed: mapGetters({
'numbers'
})
computed: mapState({
computedNumber: 'numbers'
})
methods: mapActions({ methodAddNumber: 'addNumber'
})
computed: mapGetters({
computedNumbers:'numbers'
})
app/
components/
cart/
product/
store/
index.js
🛒
const state = {
// ...
}
const mutations = {
// ...
}
const actions = {
// ...
}
const getters = {
// ...
}
export default new Vuex.Store({
state,
mutations,
actions,
getters
});
store/index.js
const cartModule = {
state,
mutations,
actions,
getters
}
const productModule = {
state,
mutations,
actions,
getters
}
export default new Vuex.Store({
modules: {
cartModule,
productModule
}
});
this.$store.state.cartModule
this.$store.state.productModule
this.$store.dispatch('name-of-any-action')
this.$store.getters['name-of-any-getter']
namespaced: true,
const cartModule = {
namespaced: true,
state,
mutations,
actions,
getters
}
const cartModule = {
}
const productModule = {
namespaced: true,
state,
mutations,
actions,
getters
}
namespaced: true,
const productModule = {
}
this.$store.state.cartModule
this.$store.dispatch('cartModule/name-of-action')
this.$store.getters['cartModule/name-of-getter']
...mapGetters([
'cartModule/name-of-getter'
]);
...mapActions([
'cartModule/name-of-action'
]);
store/
index.js
cart/
index.js
product/
index.js
index.js
store/
cart/
index.js
index.js
actions.js
getters.js
mutations.js
product/
index.js
actions.js
getters.js
mutations.js
store/
cart/
index.js
product/
user/
actions.js
getters.js
index.js
mutations.js
store/
cart/
index.js
product/
user/
shared/
this.$emit('name-of-event', {});
Event Bus is a new Vue instance that's made global:
const EventBus = new Vue();
Store manages application state AND methods responsible in mutating state
Introduces explicitly defined getters, mutations, and actions
Integrates with Vue Devtools for time-travel debugging
🎉