setup()
메서드를 합쳐주는 것이었다.<script>
import { ref } from 'vue';
export default {
setup() {
const uName = ref('Maximilian');
const uAge = ref(27);
setTimeout(function() {
uName.value = 'Max';
}, 2000);
return { uName, age:uAge };
}
}
</script>
를
<script setup>
import { ref } from 'vue';
const uName = ref('Maximilian');
setTimeout(function() {
uName.value = 'Max';
}, 2000);
</script>
으로 대체할 수 있다는 뜻이다. 또한 <script setup>의 장점으로 마크업 단에서 굳이 return값을 사용하지 않아도 되고 같은 변수명을 사용할 수 있다.
<tamplate>
...
<button @click="마크업함수">변환!</button>
...
</template>
<script>
setup(){
function 함수1 () {
...
}
...
return { 마크업함수 : 함수1 }
}
</script>
를
<tamplate>
...
<button @click="함수1">변환!</button>
{{ 함수1 }}
...
</template>
<script setup>
const 변수1 = ref('헬창');
function 함수1 () {
변수1.value = '개발자'
...
}
</script>
이렇게 쓸 수 있는 미친 편리한 기능이다!!!!
<template>
<h1>{{uName}}</h1>
<div>
<input type="text" placeholder="First Name" v-model="firstName"/>
<input type="text" placeholder="Last Name" v-model="lastName"/>
</div>
</template>
<script setup>
import {computed, reactive, ref} from 'vue';
const firstName = ref("");
const lastName = ref("");
const uName = computed(function (){
return firstName.value+lastName.value
})
console.log(uName);
</script>
<template>
<h1>{{uName}}</h1>
<h2>{{uAge}}</h2>
<button @click="setNewData">Change Age</button>
<div>
<input type="text" placeholder="First Name" v-model="firstName"/>
<input type="text" placeholder="Last Name" v-model="lastName"/>
</div>
</section>
</template>
<script setup>
import {computed, reactive, ref, watch} from 'vue';
const user = reactive({name:'헬창',age:27})
const firstName = ref("");
const lastName = ref("");
const uAge = ref(27);
const setNewData = () => {
uAge.value=32
}
const uName = computed(()=>{
return firstName.value+lastName.value
})
watch([uAge, uName],(newValues, oldValues)=>{
console.log("oldAge : "+oldValues[0])
console.log("newAge : "+newValues[0])
console.log("oldName : "+newValues[1])
console.log("newName : "+newValues[1])
})
</script>
const props = defineProps({
user:{
type: Object,
default: ()=>({projects:String, fullName:String})
}
})
const enteredSearchTerm = ref('')
const activeSearchTerm = ref('')
const hasProjects = computed(()=>{
return props.user.projects && availableProjects.value.length > 0
})
const availableProjects = computed(()=>{
if (activeSearchTerm.value) {
return props.user.projects.filter((prj)=>
prj.title.includes(activeSearchTerm.value)
)
}
return props.user.projects;
})
const updateSearch = (val) => {
enteredSearchTerm.value = val;
}
watch(enteredSearchTerm,(newValue)=>{
setTimeout(() => {
if (newValue === enteredSearchTerm.value) {
activeSearchTerm.value = newValue;
}
}, 300);
})
watch(props.user,()=>{
enteredSearchTerm.value = ''
})
이때 위와같은 에러 코드를 볼 수 있는데 이는 watch의 소스가 null이어서 유효하지 않다는 경고 메시지이다.
이게 뜨는 이유는 props를 사용해서 user에 접근할 때 문제가 발생하는데 반응형 객체의 내부 정보를 파악하고 비반응형 값을 watch한다.
처음에는 어떤 사용자도 선택되지 않으므로 user는 null로 초기화되고 null을 감시하기 때문에 Vue가 이해할 수 없다.
따라서 반응형 객체를 사용해야 한다. ref 또는 반응형 객체를 사용해야한다.
props는 반응형 객체지만 모듈에서 보았듯이 props의 값(여기서는 props.user)은 반응형이 아니다
즉, props 전체를 감시해야 한다는 것이다.
watch(props,()=>{
enteredSearchTerm.value = ''
})
const {user} = toRefs(props);
watch(user,()=>{
enteredSearchTerm.value = ''
})