Có thể truy cập cửa hàng dưới dạng đối tượng trong tệp js bên ngoài, tôi cũng đã thêm thử nghiệm để chứng minh các thay đổi trong tiểu bang.
đây là file js bên ngoài:
import { store } from '../store/store'
export function getAuth() {
return store.state.authorization.AUTH_STATE
}
Module nhà nước:
import * as NameSpace from '../NameSpace'
/*
Import everything in NameSpace.js as an object.
call that object NameSpace.
NameSpace exports const strings.
*/
import { ParseService } from '../../Services/parse'
const state = {
[NameSpace.AUTH_STATE]: {
auth: {},
error: null
}
}
const getters = {
[NameSpace.AUTH_GETTER]: state => {
return state[NameSpace.AUTH_STATE]
}
}
const mutations = {
[NameSpace.AUTH_MUTATION]: (state, payload) => {
state[NameSpace.AUTH_STATE] = payload
}
}
const actions = {
[NameSpace.ASYNC_AUTH_ACTION]: ({ commit }, payload) => {
ParseService.login(payload.username, payload.password)
.then((user) => {
commit(NameSpace.AUTH_MUTATION, {auth: user, error: null})
})
.catch((error) => {
commit(NameSpace.AUTH_MUTATION, {auth: [], error: error})
})
}
export default {
state,
getters,
mutations,
actions
}
Các cửa hàng:
import Vue from 'vue'
import Vuex from 'vuex'
import authorization from './modules/authorization'
Vue.use(Vuex)
export const store = new Vuex.Store({
modules: {
authorization
}
})
Cho đến nay tất cả tôi đã làm là tạo một file js xuất một hàm trả về thuộc tính AUTH_STATE
của biến trạng thái authorization
.
Một thành phần để thử nghiệm:
<template lang="html">
<label class="login-label" for="username">Username
<input class="login-input-field" type="text" name="username" v-model="username">
</label>
<label class="login-label" for="password" style="margin-top">Password
<input class="login-input-field" type="password" name="username" v-model="password">
</label>
<button class="login-submit-btn primary-green-bg" type="button" @click="login(username, password)">Login</button>
</template>
<script>
import { mapActions, mapGetters } from 'vuex'
import * as NameSpace from '../../store/NameSpace'
import { getAuth } from '../../Services/test'
export default {
data() {
return {
username: '',
password: ''
}
},
computed: {
...mapGetters({
authStateObject: NameSpace.AUTH_GETTER
}),
authState() {
return this.authStateObject.auth
},
authError() {
return this.authStateObject.error
}
},
watch: {
authError() {
console.log('watch: ', getAuth()) // ------------------------- [3]
}
},
authState() {
if (this.authState.sessionToken) {
console.log('watch: ', getAuth()) // ------------------------- [2]
}
},
methods: {
...mapActions({
authorize: NameSpace.ASYNC_AUTH_ACTION
}),
login (username, password) {
this.authorize({username, password})
console.log(getAuth()) // ---------------------------[1]
}
}
}
</script>
Trên nút trạng thái nhấp chuột mặc định sẽ được đăng nhập vào giao diện điều khiển. Hành động trong trường hợp của tôi dẫn đến một cuộc gọi api, dẫn đến thay đổi trạng thái nếu kết hợp tên người dùng - mật khẩu có một bản ghi.
Kết quả thành công trong việc hiển thị bảng điều khiển trong đồng hồ authState
, chức năng được nhập có thể in các thay đổi được thực hiện cho tiểu bang.
Tương tự như vậy, trên một trường hợp thất bại, chiếc đồng hồ trên authError
sẽ hiển thị các thay đổi đối với nhà nước
Tôi không hiểu đầy đủ như tôi không thể nhìn thấy các file của bạn nhưng vue.use (vuex) cho biết thêm lên vuex cho tất cả vue của bạn các thành phần. Đó có thể là lý do tại sao utils.js của bạn sẽ không có quyền truy cập vào nó. Tôi cho phép các hàm bên ngoài trở thành một phần của các hành động, lấy trạng thái làm đối số và trả về giá trị cho đột biến. –
Không có tệp demo vì nó là 'vấn đề chung'. Và có, tôi biết làm thế nào để giải quyết điều này trong một tập tin vue, nhưng câu hỏi của tôi là 'làm thế nào để có được nhà nước trong một tập tin js'. 'Giải pháp' của bạn không rõ ràng với tôi; có vẻ như bạn đang tiếp cận trạng thái trong tệp vue (sử dụng 'hàm bên ngoài'). Tuy nhiên, tôi muốn (nếu có thể) tiếp cận trạng thái vue từ bên trong một tệp js. – musicformellons
Có, tôi không muốn thay đổi trạng thái bên ngoài. Bạn có thể đưa ra ý tưởng về loại công việc bạn đang làm trong utils không? Bởi vì tôi cảm thấy mạnh mẽ khi sử dụng các hành động hoặc đột biến vuex sẽ loại bỏ sự cần thiết phải có được trạng thái bên ngoài cửa hàng vuex. –