問題
載入json一定要用ajax的方式嗎?
最近學習vue3.0,在實現一個功能的時候發現一個問題——
寫程式碼的時候,需要的json太長、太多,和程式碼放在一起太混亂。看程式碼總有翻來翻去,又沒有“摺疊”功能。
那麼能不能把json放在一個單獨的檔案裡面儲存,然後在載入進來呢?
查了半天的資料,發現那叫一個折騰呀,各種各樣的配置不說,最後還需要用ajax的方式來載入。這個,這麼簡單的事情為啥要這麼折騰?
你看引用元件是不是很方便?一行程式碼就搞定了。就像下面這樣:
import nfInput from '@/components/nf-form-item.vue'
等等,元件??
思路
上面提到了元件,那麼能不能把json放在元件裡面儲存,然後“頁面”里載入元件獲取元件裡面的json呢?各種嘗試之後發現是可以的,涉及幾個關鍵字:
元件、屬性、data、生命週期、$emit、watch
- 先定義一個元件,設定一個屬性,這個屬性不是接收資料的,而是返回json的一個橋樑。
- 然後在元件的data裡面定義需要的json。
- 在元件的 created 事件裡面通過 $emit 向父級提交data(json)資料
- 由於是setup先執行,元件的created後執行,所以需要在setup裡面設定watch監聽屬性的變化,得到需要的json後賦值給需要的物件。
當然,json可以直接寫在created裡面,不過還是感覺放在data裡面更適合一些。
解決
定義元件
<template>
<span :value="modelValue"></span> <!--使用span-->
</template>
<script>
export default {
name: 'nf-getjson',
props: {
modelValue: Object // 屬性名稱需要寫modelValue 方便一些
},
data: function () {
return { //需要的json
json: {
controlId: 101,
controlType: 100,
colName: 'abc',
isClear: true,
disabled: false,
required: true,
class: '1',
title: '1',
rows: 5,
cols: 50,
placeholder: '請輸入',
readonly: false
}
}
},
created: function () {
this.$emit('update:modelValue', this.json) // 返回給呼叫者,vue3.0的改變的地方
}
}
</script>
.vue檔案
<template>
<nfJosn v-model="title" /> <!--就是那個傳說中的元件,使用v-model 傳遞資料-->
</template>
<script>
import { ref, watch } from 'vue' // 需要watch進行監聽
import nfJosn from '@/components/nf-getjson.vue' // 載入元件
export default {
name: 'FormHelp',
components: {
nfHelp
},
setup () {
const value = ref('') // 定義一個屬性
const json = ref({}) // 接收返回的json
// 監聽屬性變化
watch(() => value.value, json => {
json.value = json
})
return {
value,
json
}
}
}
</script>
基本就是這樣,不需要加事件。
小結
以上程式碼在vue3.0 beta版裡測試通過。
也不知道有沒有人用過這種方式,也不知道這種方式是否符合vue的規範,總之先這麼用著,不行再改。