2017-01-08 28 views
7

Tôi đang làm việc với vuex (2.1.1) và làm việc trong các thành phần tệp đơn lẻ. Tuy nhiên để tránh quá nhiều cruft trong thành phần tập tin vue duy nhất của tôi, tôi chuyển một số chức năng vào một mô-đun utils.js mà tôi nhập vào tập tin vue. Trong số này utils.js Tôi muốn đọc trạng thái vuex. Làm thế nào tôi có thể làm điều đó? Vì nó có vẻ như đang tiến gần đến trạng thái với getters etc, giả sử bạn đang làm việc từ bên trong một thành phần vue, hay không?Cách lấy trạng thái vuex từ tệp javascript (thay vì thành phần vue)

Tôi đã cố gắng import state from '../store/modules/myvuexmodule' và sau đó tham khảo state.mystateproperty nhưng nó luôn mang lại 'không xác định', trong khi đó trong vue-devtools tôi có thể thấy thuộc tính trạng thái không có giá trị thích hợp. Ước tính của tôi vào thời điểm này là đây không phải là 'cách để đi' vì giá trị state.property trong tệp js sẽ không hoạt động và do đó sẽ không cập nhật hoặc gì đó, nhưng có thể ai đó có thể xác nhận/chứng minh tôi sai.

+0

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. –

+0

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

+0

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. –

Trả lời

10

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

+1

Cảm ơn câu trả lời của bạn! Trông rất tuyệt. Tôi nghĩ rằng tôi đang nhập trạng thái thay vì lưu trữ ...Tôi đã theo một trong những ví dụ về vuex: https://github.com/vuejs/vuex/blob/dev/examples/shopping-cart/store/index.js Nó không cung cấp cho cửa hàng một cái tên, vì vậy có lẽ tôi nên làm cái đó!? – musicformellons

+0

mmmh, tôi nghĩ rằng thay đổi A: '' 'Vuex.Store mới mặc xuất khẩu ({ hành động, thu khí, module: { giỏ hàng, sản phẩm }, nghiêm ngặt: debug, plugins: debug [createLogger()]: [] }) '' ' vào B: ' '' cửa hàng const xuất khẩu = Vuex.Store (mới { hành động, thu khí, module: { giỏ hàng, sản phẩm }, nghiêm ngặt : debug, plugins: debug? [createLogger()]: [] }) '' 'sẽ vít lên tài liệu tham khảo của tôi trong các tập tin khác ... bất kỳ ý tưởng làm thế nào để tham khảo các cửa hàng trong trường hợp của A? – musicformellons

+0

Đó là nhiều hơn dọc theo dòng khi sử dụng xuất khẩu được đặt tên theo mặc định. Nếu tệp chỉ có một lần xuất, bạn nên sử dụng định dạng mặc định xuất như bạn thấy trong liên kết mẫu. Tôi đã làm theo cách đó vì thói quen của tôi là sử dụng xuất khẩu có tên ở khắp mọi nơi. –

Các vấn đề liên quan