Vue3.0 및 Reactive Programming 구현
16287 단어 Composition-APIVue.js
자기소개
Vue 3.0이 올 뻔했어!
새로운 배포 기능
프로그램 설계를 다시 활성화하는 것은 무엇입니까
해결하기 위해
복잡한 시간 개념
명령의 실행 순서를 관리할 수 없습니다.
끊임없는 답조
명령의 실행 순서를 관리할 수 없습니다.
코드가 읽기 어려워졌어요...
해결하기 위해
React hooks
Vue Composition API
Angular RxJS
두 개념으로 나누다
처리 시간의 "behavior"
값 처리 이벤트
이번 얘기.
Composition API
Composition API
가상 버전의 hooks 읽기
공식 React hooks 설치 예 import React, { useState } from 'react';
function Example() {
// Declare a new state variable, which we'll call "count"
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
이걸 Vue로?
지금까지의 Vue 표기법 <script>
export default {
name: 'demo',
data: {
branches: ['master', 'dev'],
currentBranch: 'master',
commits: null
},
created: function () {
this.fetchData()
},
watch: {
currentBranch: 'fetchData'
},
filters: {
truncate: function (v) {
var newline = v.indexOf('\n')
return newline > 0 ? v.slice(0, newline) : v
},
formatDate: function (v) {
return v.replace(/T|Z/g, ' ')
}
},
methods: {
fetchData: function () {
var xhr = new XMLHttpRequest()
var self = this
xhr.open('GET', apiURL + self.currentBranch)
xhr.onload = function () {
self.commits = JSON.parse(xhr.responseText)
console.log(self.commits[0].html_url)
}
xhr.send()
}
}
}
</script>
decorator로 Class-based로 적어주세요. <script>
import { Vue, Component, Prop } from 'vue-property-decorator'
@Component
export default class YourComponent extends Vue {
@Prop(Number) readonly propA: number | undefined
@Watch('child')
onChildChanged(val: string, oldVal: string) {}
@Emit()
onInputChange(e) {
return e.target.value
}
}
</script>
아직 미묘해?
Composition API 사용 <template>
<div>
<p>{{text}}</p>
<button @click="increment">
Count is: {{ state.count }}, double is: {{ state.double }}
</button>
</div>
</template>
<script>
import { reactive, computed } from 'vue'
export default {
props: {
text: {},
isOpen: {type: Boolean, default: false},
},
setup(props) {
const state = reactive({
count: 0,
double: computed(() => state.count * 2)
})
function increment() {
state.count++
}
return {
props,
state,
increment
}
}
}
</script>
실제로 해보세요!
라이프 사이클 연결
beforeCreated ⇒ setup
created ⇒ setup
beforeMount => onBeforeMount
updated => onUpdated
beforeDestroy => onBeforeUnmounted
destoryed => onUnmounted
errorCaptured => onErrorCaptured
라이프 사이클 연결 2
디버깅용
onRenderTracked
onRenderTriggered
Composition API의 장점은 무엇입니까?
복잡한 시간 개념
명령의 실행 순서를 관리할 수 없습니다.
끊임없는 답조
명령의 실행 순서를 관리할 수 없습니다.
코드가 읽기 어려워졌어요...
해결하기 위해
React hooks
Vue Composition API
Angular RxJS
두 개념으로 나누다
처리 시간의 "behavior"
값 처리 이벤트
이번 얘기.
Composition API
Composition API
가상 버전의 hooks 읽기
공식 React hooks 설치 예 import React, { useState } from 'react';
function Example() {
// Declare a new state variable, which we'll call "count"
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
이걸 Vue로?
지금까지의 Vue 표기법 <script>
export default {
name: 'demo',
data: {
branches: ['master', 'dev'],
currentBranch: 'master',
commits: null
},
created: function () {
this.fetchData()
},
watch: {
currentBranch: 'fetchData'
},
filters: {
truncate: function (v) {
var newline = v.indexOf('\n')
return newline > 0 ? v.slice(0, newline) : v
},
formatDate: function (v) {
return v.replace(/T|Z/g, ' ')
}
},
methods: {
fetchData: function () {
var xhr = new XMLHttpRequest()
var self = this
xhr.open('GET', apiURL + self.currentBranch)
xhr.onload = function () {
self.commits = JSON.parse(xhr.responseText)
console.log(self.commits[0].html_url)
}
xhr.send()
}
}
}
</script>
decorator로 Class-based로 적어주세요. <script>
import { Vue, Component, Prop } from 'vue-property-decorator'
@Component
export default class YourComponent extends Vue {
@Prop(Number) readonly propA: number | undefined
@Watch('child')
onChildChanged(val: string, oldVal: string) {}
@Emit()
onInputChange(e) {
return e.target.value
}
}
</script>
아직 미묘해?
Composition API 사용 <template>
<div>
<p>{{text}}</p>
<button @click="increment">
Count is: {{ state.count }}, double is: {{ state.double }}
</button>
</div>
</template>
<script>
import { reactive, computed } from 'vue'
export default {
props: {
text: {},
isOpen: {type: Boolean, default: false},
},
setup(props) {
const state = reactive({
count: 0,
double: computed(() => state.count * 2)
})
function increment() {
state.count++
}
return {
props,
state,
increment
}
}
}
</script>
실제로 해보세요!
라이프 사이클 연결
beforeCreated ⇒ setup
created ⇒ setup
beforeMount => onBeforeMount
updated => onUpdated
beforeDestroy => onBeforeUnmounted
destoryed => onUnmounted
errorCaptured => onErrorCaptured
라이프 사이클 연결 2
디버깅용
onRenderTracked
onRenderTriggered
Composition API의 장점은 무엇입니까?
처리 시간의 "behavior"
값 처리 이벤트
이번 얘기.
Composition API
Composition API
가상 버전의 hooks 읽기
공식 React hooks 설치 예 import React, { useState } from 'react';
function Example() {
// Declare a new state variable, which we'll call "count"
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
이걸 Vue로?
지금까지의 Vue 표기법 <script>
export default {
name: 'demo',
data: {
branches: ['master', 'dev'],
currentBranch: 'master',
commits: null
},
created: function () {
this.fetchData()
},
watch: {
currentBranch: 'fetchData'
},
filters: {
truncate: function (v) {
var newline = v.indexOf('\n')
return newline > 0 ? v.slice(0, newline) : v
},
formatDate: function (v) {
return v.replace(/T|Z/g, ' ')
}
},
methods: {
fetchData: function () {
var xhr = new XMLHttpRequest()
var self = this
xhr.open('GET', apiURL + self.currentBranch)
xhr.onload = function () {
self.commits = JSON.parse(xhr.responseText)
console.log(self.commits[0].html_url)
}
xhr.send()
}
}
}
</script>
decorator로 Class-based로 적어주세요. <script>
import { Vue, Component, Prop } from 'vue-property-decorator'
@Component
export default class YourComponent extends Vue {
@Prop(Number) readonly propA: number | undefined
@Watch('child')
onChildChanged(val: string, oldVal: string) {}
@Emit()
onInputChange(e) {
return e.target.value
}
}
</script>
아직 미묘해?
Composition API 사용 <template>
<div>
<p>{{text}}</p>
<button @click="increment">
Count is: {{ state.count }}, double is: {{ state.double }}
</button>
</div>
</template>
<script>
import { reactive, computed } from 'vue'
export default {
props: {
text: {},
isOpen: {type: Boolean, default: false},
},
setup(props) {
const state = reactive({
count: 0,
double: computed(() => state.count * 2)
})
function increment() {
state.count++
}
return {
props,
state,
increment
}
}
}
</script>
실제로 해보세요!
라이프 사이클 연결
beforeCreated ⇒ setup
created ⇒ setup
beforeMount => onBeforeMount
updated => onUpdated
beforeDestroy => onBeforeUnmounted
destoryed => onUnmounted
errorCaptured => onErrorCaptured
라이프 사이클 연결 2
디버깅용
onRenderTracked
onRenderTriggered
Composition API의 장점은 무엇입니까?
가상 버전의 hooks 읽기
공식 React hooks 설치 예 import React, { useState } from 'react';
function Example() {
// Declare a new state variable, which we'll call "count"
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
이걸 Vue로?
지금까지의 Vue 표기법 <script>
export default {
name: 'demo',
data: {
branches: ['master', 'dev'],
currentBranch: 'master',
commits: null
},
created: function () {
this.fetchData()
},
watch: {
currentBranch: 'fetchData'
},
filters: {
truncate: function (v) {
var newline = v.indexOf('\n')
return newline > 0 ? v.slice(0, newline) : v
},
formatDate: function (v) {
return v.replace(/T|Z/g, ' ')
}
},
methods: {
fetchData: function () {
var xhr = new XMLHttpRequest()
var self = this
xhr.open('GET', apiURL + self.currentBranch)
xhr.onload = function () {
self.commits = JSON.parse(xhr.responseText)
console.log(self.commits[0].html_url)
}
xhr.send()
}
}
}
</script>
decorator로 Class-based로 적어주세요. <script>
import { Vue, Component, Prop } from 'vue-property-decorator'
@Component
export default class YourComponent extends Vue {
@Prop(Number) readonly propA: number | undefined
@Watch('child')
onChildChanged(val: string, oldVal: string) {}
@Emit()
onInputChange(e) {
return e.target.value
}
}
</script>
아직 미묘해?
Composition API 사용 <template>
<div>
<p>{{text}}</p>
<button @click="increment">
Count is: {{ state.count }}, double is: {{ state.double }}
</button>
</div>
</template>
<script>
import { reactive, computed } from 'vue'
export default {
props: {
text: {},
isOpen: {type: Boolean, default: false},
},
setup(props) {
const state = reactive({
count: 0,
double: computed(() => state.count * 2)
})
function increment() {
state.count++
}
return {
props,
state,
increment
}
}
}
</script>
실제로 해보세요!
라이프 사이클 연결
beforeCreated ⇒ setup
created ⇒ setup
beforeMount => onBeforeMount
updated => onUpdated
beforeDestroy => onBeforeUnmounted
destoryed => onUnmounted
errorCaptured => onErrorCaptured
라이프 사이클 연결 2
디버깅용
onRenderTracked
onRenderTriggered
Composition API의 장점은 무엇입니까?
import React, { useState } from 'react';
function Example() {
// Declare a new state variable, which we'll call "count"
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
지금까지의 Vue 표기법 <script>
export default {
name: 'demo',
data: {
branches: ['master', 'dev'],
currentBranch: 'master',
commits: null
},
created: function () {
this.fetchData()
},
watch: {
currentBranch: 'fetchData'
},
filters: {
truncate: function (v) {
var newline = v.indexOf('\n')
return newline > 0 ? v.slice(0, newline) : v
},
formatDate: function (v) {
return v.replace(/T|Z/g, ' ')
}
},
methods: {
fetchData: function () {
var xhr = new XMLHttpRequest()
var self = this
xhr.open('GET', apiURL + self.currentBranch)
xhr.onload = function () {
self.commits = JSON.parse(xhr.responseText)
console.log(self.commits[0].html_url)
}
xhr.send()
}
}
}
</script>
decorator로 Class-based로 적어주세요. <script>
import { Vue, Component, Prop } from 'vue-property-decorator'
@Component
export default class YourComponent extends Vue {
@Prop(Number) readonly propA: number | undefined
@Watch('child')
onChildChanged(val: string, oldVal: string) {}
@Emit()
onInputChange(e) {
return e.target.value
}
}
</script>
아직 미묘해?
Composition API 사용 <template>
<div>
<p>{{text}}</p>
<button @click="increment">
Count is: {{ state.count }}, double is: {{ state.double }}
</button>
</div>
</template>
<script>
import { reactive, computed } from 'vue'
export default {
props: {
text: {},
isOpen: {type: Boolean, default: false},
},
setup(props) {
const state = reactive({
count: 0,
double: computed(() => state.count * 2)
})
function increment() {
state.count++
}
return {
props,
state,
increment
}
}
}
</script>
실제로 해보세요!
라이프 사이클 연결
beforeCreated ⇒ setup
created ⇒ setup
beforeMount => onBeforeMount
updated => onUpdated
beforeDestroy => onBeforeUnmounted
destoryed => onUnmounted
errorCaptured => onErrorCaptured
라이프 사이클 연결 2
디버깅용
onRenderTracked
onRenderTriggered
Composition API의 장점은 무엇입니까?
<script>
export default {
name: 'demo',
data: {
branches: ['master', 'dev'],
currentBranch: 'master',
commits: null
},
created: function () {
this.fetchData()
},
watch: {
currentBranch: 'fetchData'
},
filters: {
truncate: function (v) {
var newline = v.indexOf('\n')
return newline > 0 ? v.slice(0, newline) : v
},
formatDate: function (v) {
return v.replace(/T|Z/g, ' ')
}
},
methods: {
fetchData: function () {
var xhr = new XMLHttpRequest()
var self = this
xhr.open('GET', apiURL + self.currentBranch)
xhr.onload = function () {
self.commits = JSON.parse(xhr.responseText)
console.log(self.commits[0].html_url)
}
xhr.send()
}
}
}
</script>
<script>
import { Vue, Component, Prop } from 'vue-property-decorator'
@Component
export default class YourComponent extends Vue {
@Prop(Number) readonly propA: number | undefined
@Watch('child')
onChildChanged(val: string, oldVal: string) {}
@Emit()
onInputChange(e) {
return e.target.value
}
}
</script>
아직 미묘해?
Composition API 사용 <template>
<div>
<p>{{text}}</p>
<button @click="increment">
Count is: {{ state.count }}, double is: {{ state.double }}
</button>
</div>
</template>
<script>
import { reactive, computed } from 'vue'
export default {
props: {
text: {},
isOpen: {type: Boolean, default: false},
},
setup(props) {
const state = reactive({
count: 0,
double: computed(() => state.count * 2)
})
function increment() {
state.count++
}
return {
props,
state,
increment
}
}
}
</script>
실제로 해보세요!
라이프 사이클 연결
beforeCreated ⇒ setup
created ⇒ setup
beforeMount => onBeforeMount
updated => onUpdated
beforeDestroy => onBeforeUnmounted
destoryed => onUnmounted
errorCaptured => onErrorCaptured
라이프 사이클 연결 2
디버깅용
onRenderTracked
onRenderTriggered
Composition API의 장점은 무엇입니까?
<template>
<div>
<p>{{text}}</p>
<button @click="increment">
Count is: {{ state.count }}, double is: {{ state.double }}
</button>
</div>
</template>
<script>
import { reactive, computed } from 'vue'
export default {
props: {
text: {},
isOpen: {type: Boolean, default: false},
},
setup(props) {
const state = reactive({
count: 0,
double: computed(() => state.count * 2)
})
function increment() {
state.count++
}
return {
props,
state,
increment
}
}
}
</script>
실제로 해보세요!
라이프 사이클 연결
beforeCreated ⇒ setup
created ⇒ setup
beforeMount => onBeforeMount
updated => onUpdated
beforeDestroy => onBeforeUnmounted
destoryed => onUnmounted
errorCaptured => onErrorCaptured
라이프 사이클 연결 2
디버깅용
onRenderTracked
onRenderTriggered
Composition API의 장점은 무엇입니까?
beforeCreated ⇒ setup
created ⇒ setup
beforeMount => onBeforeMount
updated => onUpdated
beforeDestroy => onBeforeUnmounted
destoryed => onUnmounted
errorCaptured => onErrorCaptured
라이프 사이클 연결 2
디버깅용
onRenderTracked
onRenderTriggered
Composition API의 장점은 무엇입니까?
store
const StoreSymbol = Symbol()
export function provideStore(store) {
provide(StoreSymbol, store)
}
export function useStore() {
const store = inject(StoreSymbol)
if (!store) {
// throw error, no store provided
}
return store
}
const App = {
setup() {
provideStore(store)
}
}
const Child = {
setup() {
const store = useStore()
// use the store
}
}
전 세계에 주입할 수 있는 상점!
제품 가져온 소감.
const StoreSymbol = Symbol()
export function provideStore(store) {
provide(StoreSymbol, store)
}
export function useStore() {
const store = inject(StoreSymbol)
if (!store) {
// throw error, no store provided
}
return store
}
const App = {
setup() {
provideStore(store)
}
}
const Child = {
setup() {
const store = useStore()
// use the store
}
}
제품 가져온 소감.
감사합니다
Reference
이 문제에 관하여(Vue3.0 및 Reactive Programming 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/MikihiroSaito/items/35c9233418742ca28e17
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Vue3.0 및 Reactive Programming 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/MikihiroSaito/items/35c9233418742ca28e17텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)