반응형 API

reactive

ref 함수는 잠깐 잊자.

자바스크립트 객체에서 반응형 상태를 생성하기 위해선 reactive() 함수를 사용할 수 있다.

이 때 반환되는 객체를 반응형 객체라고 한다.

<template>
	<div>
		<button v-on:click="state.count++">Click {{ state.count }}</button>
	</div>
</template>

<script>
	import { reactive } from 'vue';
	export default {
		setup() {
			const state = reactive({
				count: 0,
			});

			return {
				state,
			};
		},
	};
</script>

<style></style>

이런식으로 반응형 객체를 사용할 수 있다.

이런 반응형은 객체가 객체를 value를 가지고 있는 깊이가 깊은 객체라 하더라도 잘 동작한다.

String 이나 number, boolean 을 반응형으로 만들고 싶다면?

reactive 안에 Stirng, number 넣으면 반응형으로 동작하지 않음.

오직 객체만 되나봐..

배열도 되기는 한대… 근데 단일 변수는 안됨..

아 reactive 라고 하는 애는 주소를 가지고 있는 애래 그래서 주소를 가지고 그 값을 변화한 것을 그대로 반영할 수 있으나

primitive의 경우에는 주소가 있다기 보다는 그냥 그 값 자체이므로 값이 바뀌는 걸 감지하지 못하는거래

(정확하게 이해를 못했어)

그래서 만약에 정 바꾸고 싶다면 value라는 key 값 안에 값을 넣어서 만드는 거라면 될텐데..

그래서 primitive 데이터에 동작하게 하는게 ref래

ref

원시값 반응형 데이터를 만들 때 사용한다.

number, string, boolean 에 사용한다.

ref(원시형 데이터) 넣으면 됨.

근데 저렇게 만들면 객체를 반환시킴

value 를 반환하게 됨.

결국에 value 만든 객체 안에 참조형태로 반환해주는 거임 그래서 이름도 (ref)

또 script 안에서 사용할 때는 message.value 이렇게 사용해야하고

template 안에서 사용할 때는 unwrapping 이 자동으로 되기 때문에

그냥 변수 자체 {{message}} 이렇게 사용하면 된다고 한다.

<template>
	<div>
		<p>{{ message }}</p>
		<button @click="increment">dd</button>
	</div>
</template>

<script>
	import { ref } from 'vue';
	export default {
		setup() {
			const message = ref('Hello Vue');
			const increment = () => {
				message.value = message.value + '!0';
			};

			return {
				message,
				increment,
			};
		},
	};
</script>

<style></style>

ref 속성을 reactive 객체 안의 속성으로 할당한다면??

const count = ref(0);
const state = reactive({
	count,
});
count.value++;
count.value++;
console.log(count.value);

위와 같이 코딩했을 때,

  1. count.value 로 접근해야함.
  2. staet 안에 있는 count는 state.count 만 쓰면 됨
  3. count 바뀌면 state.count도 바뀜.

ref로 선언한 반응형 상태를 배열에서도 사용해보면?

const message = ref('Hello!');
const arr = reactive([message]);
console.log(arr[0]);

위와 같이 접근하게 되면, 뭐가 많이 찍힘.

그래서 arr[0].value 라고 찍어야 접근할 수 있음.

배열은 객체랑 다름.

아놔 헷갈리게 해놨네…

반응형 상태를 구조분해 할당해보자.

객체의 몇개만 사용하고 싶을 때.

그러나 반응형 속성에서 사용하면 그 속성은 반응형을 잃게 된다.

const book = reactive({
	author: 'Vue Tema',
	year: '2020',
	title: 'Vue 3 guide',
	description: '당신은 지금 이 책을 사요',
	price: '무료',
});

const { author, title } = book;

위와 같이해서 author title을 template에서 렌더링 이 잘되는것은 확인할 수 있다.

그러나 반응형처럼 생길 순 없다.

왜냐 저렇게 구조분해할당을 하면 그냥 일반 변수 하나 만든거나 다름이 없다.

반응성을 잃어버린 것임

다시 반응형을 주고 싶다면… toRefs 사용하면됨.

const { author, title } = toRefs(book);
const { price } = toRef(book);

하나일 때는 toRef. 두개 이상일 때는 toRefs

그러면 다 반응형처럼 동작한다.

반응형에서 속성 가져올 때 사용.

readonly

반응형 객체의 변경을 방지할 수 있음.

const copy = readonly(original)

original은 반응형이라면

copy는 할당할 수 없음.

Reactive Transform 실험적인 단계

$를 붙여서

$refs 로 선언한 변수는 .value 를 안붙여도 되게끔 만들고 있는 중이라 한다.