(vue.js+typescript) 모듈에 데이터를 전달하는 간단한 설명
16384 단어 TypeScriptVue.js
대상: 어셈블리 레이어에 주입할 데이터 유형 지정
더 추상적인 구성 요소를 호출하는 것을 고려하여 데이터를 주입할 때 구성 요소props에서 전달하는 데이터의 유형을 지정할 수 있기를 바랍니다.
목표는 다음 도도부현의 선택 표시 구성 요소에 상위 구성 요소에서 Option 데이터를 전달할 때 유형을 지정하는 것입니다.
취득할 예정인 도도부현의 데이터.json
{
"id": 1,
"name": "東京都"
}, {
"id": 2,
"name": "それ以外"
}
이 데이터 자체에 형식이 없기 때문에 typescript로 이 데이터에 사용할 형식을 만들고 받아들일 때 형식을 사용하고 싶습니다.0. 설정 (vue-cli의 typescript 사용 시 기본 설정)
vue-cli를 사용하여 typescript를 사용할 때 설정한 기본 설정을 선택하십시오.@nrslib선생님의 vue.ts의 보도, 그리고 기정건문의 "실천 TypeScript~BFF와 Next.js & Nuxt.js의 유형 정의~"
https://qiita.com/nrslib/items/be90cc19fa3122266fd7
"TypeScript~BFF와 Next.js & Nuxt.js의 유형 정의를 실천합니다~"
1. 유형(인터페이스,class)의 실현
사용자 정의 구성 요소인'MyOption.vue'에 전달되는 데이터 정의로 인터페이스'MyOptionInterface'를 실시합니다.
src/models/MyOption/MyOptionInterface.ts
export default interface MyOptionInterface {
id: number;
name: string;
}
동시에 Preffecture.ts에서 My OptionInterface를 실시하고 도도부현의 데이터를 전달하는 인터페이스 "Preffecture"를 실시한다.src/models/MyOption/Prefecture.ts
import MyOptionInterface from "./MyOptionInterface";
export default class Prefecture implements MyOptionInterface {
id: number;
name: string;
constructor(p__id: number, p__name: string) {
this.id = p__id;
this.name = p__name;
}
}
2. 데이터 취득 시 유형 판별
getPrefectures()
의 반환값은 방금 생성한'My OptionInterface'를 실현하는 클래스'Preffecture'그룹의 유형을 지정합니다.prefectures
의 유형은 "Preffecture"그룹입니다.<template>
<div id="app">
<h2>アンケート</h2>
<p>アンケートにご協力ください</p>
<form v-on:submit.prevent>
<MyOption
text="あなたの住んでいる都道府県は?"
id="prefecture"
:myoptions="prefectures"
:selectedValue="{id:1}"
></MyOption>
<button @click="gatherResult">send</button>
</form>
<div v-if=" this.result.length !== 0 ">{{ result }}</div>
</div>
</template>
<script lang='ts'>
import MyOption from "./components/MyOption.vue";
import Prefecture from "./models/MyOption/Prefecture";
import { Vue } from "vue-property-decorator";
function getPrefectures():Prefecture[]{
return [{
"id": 1,
"name": "東京都"
}, {
"id": 2,
"name": "それ以外"
}];
};
export default Vue.extend({
name: "App",
data():{
result:Array<any>
prefectures:Prefecture[]
}
{
return {
result: [],
prefectures : []
};
},
created(){
this.prefectures = getPrefectures();
},
methods: {
gatherResult():void {
this.result = [];
this.result.push(
(<HTMLInputElement>document.getElementById('prefecture')).value
);
}
},
components: {
MyOption
}
});
</script>
3. 구성 요소 간의 데이터 전달 실현
myoptions
에 대해 방금 생성한'My OptionInterface'그룹의 유형을 지정합니다.<template>
<p>
<label :for="id" v-if=" text !== '' ">{{ text }}</label>
<select :id="id">
<option
v-for="myoption in myoptions"
:key="myoption.id"
:value="myoption.id"
:selected="myoption.id === selectedValue.id"
>{{ myoption.name }}</option>
</select>
</p>
</template>
<script lang='ts'>
import { Vue } from "vue-property-decorator";
import MyOptionInterface from "./../models/MyOption/MyOptionInterface";
export default Vue.extend({
props: {
text: {
type: String
},
id: {
type: String,
required: true
},
myoptions: {
type: Array as () => MyOptionInterface[],
required: true
},
selectedValue: {
type: Object
}
}
});
</script>
props의 변수에 형식을 지정할 때, 인터페이스를 지정할 때, 먼저 Array로 수신하고, MyOptionInterface의 배열에cast 형식으로 기재합니다.(class는 직접 형식을 지정할 수 있습니다.)실제 화면
화면에 아무런 변화가 없지만 반에 맡긴 데이터가 다르면 인코딩할 때 오류가 표시됩니다.
소스 코드
https://github.com/ttn1129/VueTypescriptSample
기타
shims-vue.d.ts
중의 import vue from 'vue'
가 Eslint의 Parsing Error가 될 수 있다. 결과적으로 local로 같은 원본 코드를 vue-cli 프로젝트npm run serve
로 하면 순조롭다코드 문제인 줄 알았는데codesandbox의 vue-cli 프로젝트의 환경 문제인 것 같습니다.(vue-cli의 일반 프로젝트는 전혀 문제가 없습니다. 잘 빌드할 수 있지만 typescript를 사용하는 프로젝트는build를 사용할 수 없습니다. 매혹적입니다.)https://qiita.com/kurosame/items/e56288e860cf016eaab0
HTMLElement | null
의 형식이 지정되어 있는 것 같아서value를 참조할 수 없기 때문에cast에서 HTML Input Element로 value를 얻었습니다.https://stackoverflow.com/questions/12989741/the-property-value-does-not-exist-on-value-of-type-htmlelement
Reference
이 문제에 관하여((vue.js+typescript) 모듈에 데이터를 전달하는 간단한 설명), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ttn_tt/items/80a08d0ad8778d792671텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)