이 글을 쓰는 것을 피하는 방법.$store.state.donkey는 Vue에서 항상?
Vue를 배우고 있는데 어느 곳에서나 다음과 같은 구문이 있다는 것을 알게 되었습니다.
export default {
components: { Navigation, View1 },
computed: {
classObject: function() {
return {
alert: this.$store.state.environment !== "dev",
info: this.$store.state.environment === "dev"
};
}
}
}
쓰는 것은 귀찮다.this.$store.state.donkey
가독성도 떨어집니다.나는 내가 그것을 최적이 아닌 방법으로 하고 있다는 것을 느낀다.매장 상황을 어떻게 설명하면 좋을까요?
상태와 getter 모두에 대해 계산된 속성을 설정할 수 있습니다.
computed: {
donkey () {
this.$store.state.donkey
},
ass () {
this.$store.getters.ass
},
...
일단 VM 상의 당나귀나 당나귀를 참조할 수 있게 되면 $state.store에 전화해야 하지만...
더 쉽게 하기 위해 vuex 지도 도우미를 불러와서 네 엉덩이를 찾는 데 사용할 수 있어...또는 당나귀:
import { mapState, mapGetters } from 'vuex'
default export {
computed: {
...mapState([
'donkey',
]),
...mapGetters([
'ass',
]),
...mapGetters({
isMyAss: 'ass', // you can also rename your states / getters for this component
}),
지금 보면this.isMyAss
찾을 수 있을 거야...당신의.ass
getters, modiations, actions는 글로벌하기 때문에 스토어에서 직접 참조할 수 있습니다.
store.getters
,store.commit
&store.dispatch
각각 다음과 같다.이는 모듈 내 또는 스토어의 루트에 있는 경우에도 적용됩니다.모듈에 있는 경우 이전에 사용한 이름(vuex docs 이름)을 덮어쓰지 않도록 네임스페이스를 확인합니다.단, 모듈 상태를 참조하는 경우 모듈 이름 앞에 추가되어야 합니다.store.state.user.firstName
이 예에서는user
는 모듈입니다.
17년 5월 23일 편집
Vuex 쓰기 시간이 업데이트되고 네임스페이스 기능이 모듈 작업 시 사용할 수 있게 되었습니다.간단하게 추가namespace: true
모듈 내보내기, 즉
# vuex/modules/foo.js
export default {
namespace: true,
state: {
some: 'thing',
...
를 추가하다foo
vuex 스토어 모듈:
# vuex/store.js
import foo from './modules/foo'
export default new Vuex.Store({
modules: {
foo,
...
이 모듈을 컴포넌트에 삽입할 때 다음 작업을 수행할 수 있습니다.
export default {
computed: {
...mapState('foo', [
'some',
]),
...mapState('foo', {
another: 'some',
}),
...
이를 통해 모듈을 매우 심플하고 깨끗하게 사용할 수 있습니다.또한 여러 레벨의 네임스페이스 vuex docs를 네스트할 경우 매우 편리합니다.
vuex 스토어에서 참조 및 작업할 수 있는 다양한 방법을 소개하기 위해 예제 바이올린을 준비했습니다.
또는 다음 항목을 확인하십시오.
const userModule = {
state: {
firstName: '',
surname: '',
loggedIn: false,
},
// @params state, getters, rootstate
getters: {
fullName: (state, getters, rootState) => {
return `${state.firstName} ${state.surname}`
},
userGreeting: (state, getters, rootState) => {
return state.loggedIn ? `${rootState.greeting} ${getters.fullName}` : 'Anonymous'
},
},
// @params state
mutations: {
logIn: state => {
state.loggedIn = true
},
setName: (state, payload) => {
state.firstName = payload.firstName
state.surname = payload.surname
},
},
// @params context
// context.state, context.getters, context.commit (mutations), context.dispatch (actions)
actions: {
authenticateUser: (context, payload) => {
if (!context.state.loggedIn) {
window.setTimeout(() => {
context.commit('logIn')
context.commit('setName', payload)
}, 500)
}
},
},
}
const store = new Vuex.Store({
state: {
greeting: 'Welcome ...',
},
mutations: {
updateGreeting: (state, payload) => {
state.greeting = payload.message
},
},
modules: {
user: userModule,
},
})
Vue.component('vuex-demo', {
data () {
return {
userFirstName: '',
userSurname: '',
}
},
computed: {
loggedInState () {
// access a modules state
return this.$store.state.user.loggedIn
},
...Vuex.mapState([
'greeting',
]),
// access modules state (not global so prepend the module name)
...Vuex.mapState({
firstName: state => state.user.firstName,
surname: state => state.user.surname,
}),
...Vuex.mapGetters([
'fullName',
]),
...Vuex.mapGetters({
welcomeMessage: 'userGreeting',
}),
},
methods: {
logInUser () {
this.authenticateUser({
firstName: this.userFirstName,
surname: this.userSurname,
})
},
// pass an array to reference the vuex store methods
...Vuex.mapMutations([
'updateGreeting',
]),
// pass an object to rename
...Vuex.mapActions([
'authenticateUser',
]),
}
})
const app = new Vue({
el: '#app',
store,
})
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vuex"></script>
<div id="app">
<!-- inlining the template to make things easier to read - all of below is still held on the component not the root -->
<vuex-demo inline-template>
<div>
<div v-if="loggedInState === false">
<h1>{{ greeting }}</h1>
<div>
<p><label>first name: </label><input type="text" v-model="userFirstName"></p>
<p><label>surname: </label><input type="text" v-model="userSurname"></p>
<button :disabled="!userFirstName || !userSurname" @click="logInUser">sign in</button>
</div>
</div>
<div v-else>
<h1>{{ welcomeMessage }}</h1>
<p>your name is: {{ fullName }}</p>
<p>your firstName is: {{ firstName }}</p>
<p>your surname is: {{ surname }}</p>
<div>
<label>Update your greeting:</label>
<input type="text" @input="updateGreeting({ message: $event.target.value })">
</div>
</div>
</div>
</vuex-demo>
</div>
돌연변이나 동작을 끌어당기고 싶은 경우 이와 유사한 방법으로 수행되지만 사용법은mapMutations
또는mapActions
믹스인 추가
위의 동작을 확장하려면 이것을 mixin과 결합하면 됩니다.그러면 위의 계산된 속성을 한 번만 설정하고 mixin을 필요로 하는 컴포넌트에서 mixin을 가져오면 됩니다.
animals.module (파일 내의 파일)
import { mapState, mapGetters } from 'vuex'
export default {
computed: {
...mapState([
'donkey',
...
컴포넌트
import animalsMixin from './mixins/animals.js'
export default {
mixins: [
animalsMixin,
],
created () {
this.isDonkeyAnAss = this.donkey === this.ass
...
언급URL : https://stackoverflow.com/questions/40909576/how-to-avoid-the-need-of-writing-this-store-state-donkey-all-the-time-in-vue
'programing' 카테고리의 다른 글
Larabel의 VUE2 구성 요소 레지스터 (0) | 2022.08.21 |
---|---|
Vue 2 - 소품 배열 기본 유형 설정 방법 (0) | 2022.08.21 |
Vuex 상태 필터링 (0) | 2022.08.21 |
노드 14/Vue2.js에서 옵션 체인 구문을 사용한 오류(예기치 않은 토큰) (0) | 2022.08.19 |
VueJS - "npm run build"에서 dist 폴더에 index.html 파일이 생성되지 않음 (0) | 2022.08.19 |