Vue CLI + TypeScript로 오미 복권을 당겼습니다.
14803 단어 Vue.js자바스크립트vue-cliTypeScript
소개
요 전날 회사의 LT 에서 JavaScript
의 OptionalChaining
와 Null合体演算子
에 대해 발표했습니다만, 그것이 계기로 TypeScript
사용하고 싶게 되었습니다.
어쨌든 뭔가 만들고 싶다고 생각했기 때문에 이번에는 Vue CLI
를 사용하여 Vue
+ TypeScript
로 오미쿠지를 끌 수 있는 정적인 web 앱을 만들어 보겠습니다.
초기 설정
환경
환경
Vue CLI v4.1.1
TypeScript
의 지원은 v3.0
계에서 있는 것 같기 때문에, v3.0
계에서도 괜찮습니다.Vue CLI
설치는 여기서 생략됩니다.프로젝트 만들기
$ vue create neko-omikuji
대화 형식으로 초기 설정을 할 수 있습니다. 아래의 선택에서는 이번은
TypeScript
를 사용하고 싶으므로, 매뉴얼로 설정합니다.? Please pick a preset:
default (babel, eslint)
❯ Manually select features
그런 다음 설치할 기능을 선택합니다. 이번은 심플하게 사용하고 싶었으므로 아래와 같이 선택했습니다.
? Check the features needed for your project:
◯ Babel
◉ TypeScript
◯ Progressive Web App (PWA) Support
◉ Router
◯ Vuex
◯ CSS Pre-processors
❯◉ Linter / Formatter
◯ Unit Testing
◯ E2E Testing
그리고 여러가지 설정이 계속됩니다만 기호로 선택해 갑니다.
? Use class-style component syntax? Yes
? Use Babel alongside TypeScript (required for modern mode, auto-detected polyfills, transpiling JSX
)? No
? Use history mode for router? (Requires proper server setup for index fallback in production) Yes
? Pick a linter / formatter config: Airbnb
? Pick additional lint features: (Press <space> to select, <a> to toggle all, <i> to invert selectio
n)Lint on save
? Where do you prefer placing config for Babel, ESLint, etc.? In dedicated config files
? Save this as a preset for future projects? No
🎉 Successfully created project neko-omikuji.
👉 Get started with the following commands:
이 메시지가 나오면 작성 완료입니다!
조속히 움직이자.
$ cd neko-omikuji
$ npm run serve
예제 화면이 나왔습니다!
구현
오미쿠지를 당기면 당사의 고양이 직원의 이미지가 무작위로 표시되는 것을 목표로 했습니다.
메인이 되는 페이지로부터 구현해 갑니다.
데코레이터를 사용하여 Vue
를 작성하는 방법을 시도해 봅니다.
Omikuji.vue<template>
<div>
<p>運試しにゃ🐱</p>
<a
href="#"
@click="onLightboxOpen">
<img
alt="omikuji"
class="omikuji"
src="../assets/omikuji.png">
</a>
<lightbox
v-if="isLightboxActive"
:is-active="isLightboxActive"
:src="src"
:result="resultList[result]"
@lightbox-close="onLightboxClose" />
</div>
</template>
<script lang="ts">
import { Component, Vue } from 'vue-property-decorator'
import Lightbox from './Lightbox.vue'
@Component({
components: {
Lightbox,
},
})
export default class Omikuji extends Vue {
// data
isLightboxActive: boolean = false
resultList: {} = {
daikichi: '大吉',
kichi: '吉',
chukichi: '中吉',
syokichi: '小吉',
suekichi: '末吉',
kyo: '凶',
daikyo: '大凶',
}
result: string = ''
number: number = 1
// computed
get src(): string {
return `./img/${this.result}_${this.number}.png`
}
// methods
getResult(): void {
const keys = Object.keys(this.resultList)
this.result = keys[Math.floor(Math.random() * keys.length)]
this.number = Math.floor(Math.random() * 3) + 1
}
onLightboxOpen(): void {
this.getResult()
this.isLightboxActive = true
}
onLightboxClose(): void {
this.isLightboxActive = false
}
}
</script>
...
템플릿이야말로 변하지 않지만,
스크립트는 평상시의 Vue
의 작성법과는 상당히 다릅니다.
data
는 클래스의 속성으로,computed
는 get
및 set
접근자를 사용하여,method
는 클래스의 메소드로서,
각각 정의됩니다.
또한 components
옵션은 데코레이터를 사용합니다.
그런 다음 이미지가 표시됩니다. Lightbox
구성 요소를 만듭니다.
Lightbox.vue...
<script lang="ts">
import {
Component, Prop, Vue, Emit,
} from 'vue-property-decorator'
import FadeTransition from './FadeTransition.vue'
@Component({
components: {
FadeTransition,
},
})
export default class Lightbox extends Vue {
@Prop({ default: false })
isActive!: Boolean
@Prop({ default: '' })
src!: String
@Prop({ default: '' })
result!: String
@Emit('lightbox-close')
// eslint-disable-next-line class-methods-use-this
onLightboxClick() {}
}
</script>
...
부모 컴퍼넌트로부터 건네받는 props
도 데코레이터를 사용해 썼습니다.
음, 솔직히 속성에 쓰는 것이 더 쉽습니다.$emit
또한 데코레이터를 사용합니다.
완성
네, 완성한 것이 이쪽이 됩니다.
qnote 고양이 오미쿠지
결론
그래서 Vue
와 TypeScript
에서 쉽게 놀아 보았습니다.
처음에는 평소와 다른 기술 방법에 당황했습니다만, 형태를 명확하게 하면서 실장해 가는 것으로 기능의 이미지가 잡기 쉬우거나, 에디터의 서포트가 짙어지거나, 확실히 메리트는 있다고 느꼈습니다 .
이번에 사용하고 싶었던 OptionalChaining
는 사용할 기회가 없었던 것과 Vue CLI
의 TypeScript
때때로, 3.5.3
를 공부하고 싶습니다!
이번 작성한 코드는 여기 에 있으므로, 필요하면 봐 주세요.
마지막으로, 소재를 빌린 원한다면 야님, 언제나 귀여운 사진을 찍어 주시는 qnote 여러분, 치유를 주는 폐사 고양이 사원의 분들, 감사합니다!
Reference
이 문제에 관하여(Vue CLI + TypeScript로 오미 복권을 당겼습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/t_arase/items/94475ffb88427da9e498
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
<template>
<div>
<p>運試しにゃ🐱</p>
<a
href="#"
@click="onLightboxOpen">
<img
alt="omikuji"
class="omikuji"
src="../assets/omikuji.png">
</a>
<lightbox
v-if="isLightboxActive"
:is-active="isLightboxActive"
:src="src"
:result="resultList[result]"
@lightbox-close="onLightboxClose" />
</div>
</template>
<script lang="ts">
import { Component, Vue } from 'vue-property-decorator'
import Lightbox from './Lightbox.vue'
@Component({
components: {
Lightbox,
},
})
export default class Omikuji extends Vue {
// data
isLightboxActive: boolean = false
resultList: {} = {
daikichi: '大吉',
kichi: '吉',
chukichi: '中吉',
syokichi: '小吉',
suekichi: '末吉',
kyo: '凶',
daikyo: '大凶',
}
result: string = ''
number: number = 1
// computed
get src(): string {
return `./img/${this.result}_${this.number}.png`
}
// methods
getResult(): void {
const keys = Object.keys(this.resultList)
this.result = keys[Math.floor(Math.random() * keys.length)]
this.number = Math.floor(Math.random() * 3) + 1
}
onLightboxOpen(): void {
this.getResult()
this.isLightboxActive = true
}
onLightboxClose(): void {
this.isLightboxActive = false
}
}
</script>
...
...
<script lang="ts">
import {
Component, Prop, Vue, Emit,
} from 'vue-property-decorator'
import FadeTransition from './FadeTransition.vue'
@Component({
components: {
FadeTransition,
},
})
export default class Lightbox extends Vue {
@Prop({ default: false })
isActive!: Boolean
@Prop({ default: '' })
src!: String
@Prop({ default: '' })
result!: String
@Emit('lightbox-close')
// eslint-disable-next-line class-methods-use-this
onLightboxClick() {}
}
</script>
...
네, 완성한 것이 이쪽이 됩니다.
qnote 고양이 오미쿠지
결론
그래서 Vue
와 TypeScript
에서 쉽게 놀아 보았습니다.
처음에는 평소와 다른 기술 방법에 당황했습니다만, 형태를 명확하게 하면서 실장해 가는 것으로 기능의 이미지가 잡기 쉬우거나, 에디터의 서포트가 짙어지거나, 확실히 메리트는 있다고 느꼈습니다 .
이번에 사용하고 싶었던 OptionalChaining
는 사용할 기회가 없었던 것과 Vue CLI
의 TypeScript
때때로, 3.5.3
를 공부하고 싶습니다!
이번 작성한 코드는 여기 에 있으므로, 필요하면 봐 주세요.
마지막으로, 소재를 빌린 원한다면 야님, 언제나 귀여운 사진을 찍어 주시는 qnote 여러분, 치유를 주는 폐사 고양이 사원의 분들, 감사합니다!
Reference
이 문제에 관하여(Vue CLI + TypeScript로 오미 복권을 당겼습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/t_arase/items/94475ffb88427da9e498
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Vue CLI + TypeScript로 오미 복권을 당겼습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/t_arase/items/94475ffb88427da9e498텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)