【发布时间】:2021-07-07 22:20:59
【问题描述】:
当我想从 onMounted 函数中的道具获取日期时遇到一些问题。
主存储模块:
import { createStore } from 'vuex'
import { categories } from './modules/categories'
export default createStore({
state: {
},
mutations: {
},
actions: {
},
modules: {
categories
}
})
每次更改路线时,我都会调用 getCategory 操作。
categories.js vuex 模块
export const categories = {
namespaced: true,
state: {
allCategories: []
},
getters: {
getAllCategories (state) {
return state.allCategories
},
},
mutations: {
UPDATE_ALL_CATEGORIES (state, newValue) {
state.allCategories = newValue
},
},
actions: {
async getCategories ({ commit, rootGetters }) {
const accessToken = rootGetters['auth/getAccessToken']
fetch('http://localhost:8080/api2/getCategories.php', {
method: 'post',
headers: { 'Content-type': 'application/x-www-form-urlencoded' },
withCredentials: true,
body: JSON.stringify({
token: accessToken
})
}).then(res=>res.json()).then((response) => {
if (response.status != '200') {
commit('UPDATE_ALL_CATEGORIES', response)
}
}).catch((error) => {
console.log('Looks like there was a problem: \n', error);
});
},
},
modules: {
}
}
Categories.vue
<template>
<div class="page-container">
<div>
<div class="items-title">
<h3>List of categories</h3>
<span>({{ allCategories.length }})</span>
</div>
<div class="items-container">
<div class="item" v-for="(category, index) in allCategories" :key="index">
<span class="item-cell size-xs">{{ index + 1 }}.</span>
<span class="item-cell size-l">{{ category.name }}</span>
</div>
</div>
</div>
<custom-select
:options="allCategories"
/>
</div>
</template>
<script>
import CustomSelect from '../components/Input/CustomSelect'
import { computed } from 'vue'
import { useStore } from 'vuex'
export default {
components: {
CustomSelect
},
setup() {
const store = useStore()
const allCategories = computed(() => store.getters['categories/getAllCategories'])
return {
allCategories
}
}
}
</script>
<style lang="scss" scoped>
@import '@/assets/scss/variables.scss';
</style>
在类别组件中,我导入了 CustomSelect 组件。当我想在 onMounted 函数中控制台日志道具时,道具是未定义的。有谁知道可能是什么问题?
CustomSelect.vue
<template>
<div class="custom-select-container" @click="openSelect">
<div class="selected-item">
<span class="selected-items-text">{{ selectedItem.name }}</span>
<span class="icon-arrow1_b selected-items-icon" :class="{ active: showOptions }" />
</div>
<transition name="fade">
<ul v-show="options.length && showOptions" class="custom-select-options">
<li v-for="(option, index) in options" :key="index" class="custom-select-item" @click="changeSelected(option)">{{ option.name }}</li>
</ul>
</transition>
</div>
</template>
<script>
import { ref, onBeforeUpdate, onMounted } from 'vue'
export default {
props: ['options'],
setup(props) {
let showOptions = ref(false)
let selectedItem = ref({})
onBeforeUpdate(() => {
if (Object.keys(selectedItem.value).length === 0) {
selectedItem.value = props.options[0]
}
})
onMounted(() => {
console.log(props.options[0])
})
const openSelect = () => {
showOptions.value = !showOptions.value
}
const changeSelected = (item) => {
selectedItem.value = item
}
// console.log(JSON.parse(JSON.stringify(props.options)))
return {
openSelect,
showOptions,
changeSelected,
selectedItem
}
}
}
</script>
【问题讨论】: