728x90
๋ฐ์ํ
๐ก ์ค์ต ํฌ์ธํธ!
- ์ค๋์ Composition API ๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก์ ๊ฒ์๊ธฐ๋ฅ์ ๋ง๋ค์ด๋ณด์๋ค.
- ์์ง Composition API ์ฌ์ฉ์ด ๋ฏธ์ํ์ฌ ์ด์ ์ ๊ณต๋ถํ ๋ด์ฉ๋ค์ ํ๋์ฉ ์ฐพ์๊ฐ๋ฉฐ ์ฝ๋๋ฅผ ์์ฑํด์ผํ๊ธด ํ์ง๋ง ๊ณ์ํด์ ๋งํ๋ ๋ถ๋ถ์ ์๋ํ์ฌ ์ต์ข ์ ์ผ๋ก ๊ธฐ๋ฅ์ ์ ๋ง๋ค์ด๋๋ค.
- ๋๋ match() ์ ์ ๊ท์์ ์ด์ฉํ๋๋ฐ, ๊ฐ์ฌ๋์ indexOf() ๋ฅผ ์ด์ฉํ์ จ๊ธฐ์ ์ฝ๋ ๋ถ์๋ ๊ฐ์ด ์งํํด๋ณด์๋ค.
๐ ref() ๋ง๊ณ reactive() ์ฌ์ฉํด๋ณด๊ธฐ
import { ref, reactive } from 'vue'
export default {
setup(){
let followers = ref([]);
let test = reactive({name : 'Seoyun'})
return { followers }
},
}
- ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค ๋๋ ref() ๋ฅผ ์ฌ์ฉํ๋ผ๊ณ ๋ฐฐ์ ์ง๋ง reactive() ๋ import ํด์ค๋ฉด ๋์ผํ๊ฒ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
- ref() ๋ฅผ ์ฌ์ฉํ๋ reactive() ๋ฅผ ์ฌ์ฉํ๋ ๋์ผํ ์ญํ ์ ํ๋๋ฐ ref() ๋ ์ซ์, ๋ฌธ์์ ๊ฐ์ ์์ ์๋ฃํ(Primitive data type) ์, reactive() ๋ object, array ์ ๊ฐ์ ์ฐธ์กฐ ์๋ฃํ(reference data type) ์ ์ฃผ๋ก ๋ด๋๋ค.
(๋ ๋ค ๋์ผํ ํจ์์ด๊ธฐ ๋๋ฌธ์ ๊ตฌ๋ถํ๊ธฐ ๊ท์ฐฎ์ผ๋ฉด ref() ๋ฅผ ์ฃผ๋ก ์ฌ์ฉํด๋ ๋๋ค.)
๐ props ์ฌ์ฉํ๊ธฐ
import { ref, toRefs } from 'vue'
export default {
setup(props){
let followers = ref([]);
let { props์ด๋ฆ } = toRefs(props)
console.log(props์ด๋ฆ.value)
return { followers }
},
}
- Composition API ๋ฅผ ์ฌ์ฉํด์ ๊ฐ๋ฐํ ๋ setup() ์์ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋๊ธด ํ์ง๋ง, setup() ์์์๋ ๋ฑ๋กํ props ๋ฅผ this.props ์ ๊ฐ์ ํํ๋ก ๊ฐ์ ธ๋ค ์ฌ์ฉํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ค.
- ๋ฐ๋ผ์, props ๋ฅผ ๊ผญ ๊ฐ์ ธ์์ ๋ญ๊ฐ ๊ฐ๋ฐ์ ํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ ์์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ค.
- setup() ์์๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ ๊ฐ๊น์ง ๋ฃ์ ์ ์๋๋ฐ, ์ฒซ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ ์๋์ผ๋ก props ๊ฐ ๋๊ณ , ๋๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ context ์ด๋ค.
- ๋จ, ์ด๋ฅผ ๊ทธ๋ฅ ์ฌ์ฉํ ์๋ ์๊ณ , ์ค์๊ฐ ๋ฐ์์ด ์ ๋๋๋ก ์ฌ์ฉํ๋ ค๋ฉด ref() ์์ ๋ด์์ ์ฌ์ฉํด์ผ ํ๋ค.
- props ๊ฐ ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ์๋ ref() ๊ฐ ์๋ toRefs() ๋ฅผ import ํด์์ ์ด์ฉํ๋ฉด ๋๋ค.
(toRefs() ๋ ref() ์ ๋์ผํ ๊ธฐ๋ฅ์ ํ๋, ref() ๋ฅผ ์ฌ๋ฌ ๋ฒ ํด์ฃผ๋ ํจ์์ด๋ค.) - ๊ทธ๋ฆฌ๊ณ toRefs() ๋ฅผ ์ฌ์ฉํ ๋์๋ ๋ฑํธ ์ผ์ชฝ์ { props์ด๋ฆ1, props์ด๋ฆ2 ... } ์ด๋ฐ ์์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํด์ฃผ๋ฉด ๋๋ค.
- props ๋ฅผ ์ถ๋ ฅํด๋ณด๊ณ ์ถ๋ค๋ฉด .value ๋ฅผ ๋ถ์ฌ์ ์ถ๋ ฅํด์ผ ํ๋ค.
๐ watch ์ฌ์ฉํ๊ธฐ
import { ref, watch } from 'vue'
export default {
setup(props){
let followers = ref([]);
watch( ๋ฐ์ดํฐ์ด๋ฆ, ()=>{ ๋ฐ์ดํฐ์ ๋ณํ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ์คํํ ์ฝ๋ } )
return { followers }
},
}
- Composition API ๋ฅผ ์ฌ์ฉํด์ ๊ฐ๋ฐํ ๋, setup() ์์์ watch ๊ฐ์ ๊ฒ์ผ๋ก ๋ฐ์ดํฐ์ ๋ณํ๋ฅผ ๊ฐ์ํ๊ณ ์ถ์ผ๋ฉด ์์ ๊ฐ์ด watch() ๋ฅผ import ํด์์ ์ฌ์ฉํ๋ฉด ๋๋ค.
- watch() ๋ props ๋ ๊ฐ์ํ ์ ์๋ค.
๐ computed ์ฌ์ฉํ๊ธฐ
import { ref, computed } from 'vue'
export default {
setup(props){
let followers = ref([]);
let ๋ณ์์ด๋ฆ = computed( ()=>{ return 10 } )
console.log(๋ณ์์ด๋ฆ.value)
return { followers }
},
}
- computed ๋ ๋ฐ์ดํฐ์ ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์ ๊น ์ ์ฅํ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
- computed ๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ ๋์๋ computed ๋ฅผ import ํด์จ ๋ค์์ ์๊ดํธ ์์ ํจ์ ํ๋๋ฅผ ๋ง๋ค์ด์ฃผ๋ฉด ๋๋ค.
- ๊ทธ๋ฌ๋ฉด ํด๋น ํจ์๋ ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ return ํด์ฃผ๋๋ฐ ์ด๋ฅผ ๋ณ์์ ๋ด์์ ํ์ํ ๊ณณ์์ ์ฌ์ฉํ๋ฉด ๋๋ค.
- computed ๋ ์ผ์ข ์ ๋ฐ์ดํฐ ์ทจ๊ธ์ ๋ฐ์ผ๋ฏ๋ก .value ๋ฅผ ์ ์ด์ฃผ์ด์ผ ์ ์ถ๋ ฅ๋๋ค.
๐ methods ์ฌ์ฉํ๊ธฐ
import { ref } from 'vue'
export default {
setup(props){
let followers = ref([]);
function hello(){
}
return { followers, hello }
},
}
- Options API ์์๋ ์ผ๋ฐ ํจ์๋ฅผ ๋ง๋ค ๋ methods ์ ํญ๋ชฉ์ ์ถ๊ฐํ์ง๋ง, Composition API ์์๋ setup() ์์ด๋ผ๋ฉด ์ด๋๊ณณ์ด๋ ํจ์๋ฅผ ๋ง๋ค ์ ์๋ค.
- ๊ทธ๋ฆฌ๊ณ ํจ์๋ฅผ ๋ง๋ค๊ณ ๋์ return ์์ ํจ์๋ช ์ ์ ์ผ๋ฉด <template></template> ์์๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํด์ง๋ค.
๐ Vuex store ์ฌ์ฉํ๊ธฐ
import { ref } from 'vue'
import { useStore } from 'vuex'
export default {
setup(props){
let followers = ref([]);
let store = useStore();
console.log(store.state.name)
return { followers }
},
}
- setup() ์์ $store.state.name ๊ฐ์ด Vuex store ๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ ์ ์๋ค.
- ์ด ๋๋, ๋จผ์ useStore ๋ฅผ vuex ์์ import ํด์ค๋ค.
- useStore() ๋ผ๊ณ ์ ์ผ๋ฉด ์ด๊ฒ $store ์ ๋์ผํ ์๋ฏธ๋ฅผ ์ง๋๊ฒ ๋๋๋ฐ, ์ด๋ฅผ store ๋ผ๋ ๋ณ์๋ก ์ ์ฅํ๋ฉด $ ๊ธฐํธ๋ง ๋ ๊ฒ์ฒ๋ผ ๊ฑฐ์ ์ ์ฌํ๊ฒ state ๋ฅผ ๋ฝ์๋ด๋ ์ง commit() ์ ํ๋ ์ง, dispatch() ๋ฅผ ํ๋ ๊ฒ์ด ๊ฐ๋ฅํด์ง๋ค.
- ๋จ, mapState ๋ setup() ์์์ ์ฌ์ฉ์ด ๋ถ๊ฐํ๋ค.
๐ ํ๋ก์ ๊ฒ์ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ
<input class="search" @input="search($event.target.value)" placeholder="๐" />
import { onMounted, ref } from "vue";
import axios from "axios";
export default {
name: "MyPage",
setup() {
let followers = ref([]);
onMounted(() => {
axios.get("/followers.json").then((result) => {
followers.value = result.data;
});
});
function search(input) {
let filtered = followers.value.filter((follower) => {
return follower.name.match(new RegExp(input, "i"));
});
followers.value = [...filtered];
}
return { followers, search };
}
};
- ์ด์ ์ followers.json ํ์ผ์์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ์ฌ ๋ฐ์ดํฐ๋ฐ์ธ๋ฉ๋ง ํด์ฃผ์๋๋ฐ, ์ด๋ฒ์๋ ํด๋น ๋ฐ์ดํฐ๋ค์์ input ์ ์ ๋ ฅํ ๋ฌธ์๊ฐ ํฌํจ๋ ์ฌ๋๋ค์ ๊ฒ์ํด์ฃผ๋ ๊ฒ์ ๊ธฐ๋ฅ์ ๋ง๋ค์ด๋ณด์๋ค.
- ๋จผ์ input ์ @input ์์ฑ์ ์ถ๊ฐํ์ฌ input ์ด ์์ ๋ ๋, search() ๋ผ๋ ํจ์์ input ์ ์ ๋ ฅ๋ ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํด์ฃผ์๋ค.
- ์ด์ search()๋ filter() ๋ฅผ ์ฌ์ฉํด์ follower ๋ฐ์ดํฐ ํ๋ํ๋๋ฅผ input ์ ์ ๋ ฅ๋ ๊ฐ๊ณผ ๋น๊ตํด์ฃผ์๋ค.
- ๊ทธ๋ฆฌ๊ณ ์ ๋ ฅ๋ ๊ฐ๊ณผ follower ๋ฅผ ๋น๊ตํ ๋์๋, match() ๋ฅผ ์ฌ์ฉํด์ input ์ ์ ๋ ฅ๋ ๊ฐ์ ๋์๋ฌธ์ ์๊ด์์ด follower ๊ฐ ํฌํจํ๊ณ ์์ผ๋ฉด ํด๋น follower ๋ฅผ return ํด์ฃผ์๋ค.
- ๊ทธ๋ฆฌ๊ณ ์ด ๊ฐ์ filtered ์ ์ ์ฅํ ๋ค์, ์์ ํ๊ฒ filtered ๋ฅผ ๋ณต์ฌํด์ followers.value ์ ๋ฃ์ด์ฃผ์๋ค.
- ๊ทผ๋ฐ ์ฌ๊ธฐ๊น์งํ๋ฉด, ๊ฒ์์ ํ๊ณ ์ง์ฐ๋ฉด ํ๋ก์ ๋ชฉ๋ก์์ ํ๋ก์๋ค์ด ์ฌ๋ผ์ง๋ ๋ฌธ์ ์ ์ด ๋ฐ์ํ๋ค.
- followers ์์ ํํฐ๋ง์ ํด์ followers ์ ์ฌํ ๋น์ ํ๊ณ ๋ ๊ฑฐ๊ธฐ์ ํํฐ๋ง์ด ์งํ๋๋ ๊ฒ ๋ฐ๋ณต๋๋ค๋ณด๋ ๊ฒฐ๊ตญ์๋ ์๋ฌด๊ฒ๋ ๋จ์ง ์์ ๊ฒ์ด๋ค.
import { onMounted, ref } from "vue";
import axios from "axios";
export default {
name: "MyPage",
setup() {
let followersOriginal = ref([]);
let followers = ref([]);
onMounted(() => {
axios.get("/followers.json").then((result) => {
followersOriginal.value = result.data;
followers.value = [...result.data];
});
});
function search(input) {
let filtered = followersOriginal.value.filter((follower) => {
return follower.name.match(new RegExp(input, "i"));
});
followers.value = [...filtered];
}
return { followers, search };
}
};
- ๊ทธ๋์ ์์ ๊ฐ์ด followersOriginal ์ด๋ผ๋ followers ์ ๋๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค์ด๋๊ณ , ๊ฒ์์ด๋ฅผ ์ญ์ ํด์ followers ๋ฐ์ดํฐ๋ ์์ ๋์ด๋ followersOriginal ์ ์์ ๋์ง ์๊ณ ๋ณด์กด๋๋ฏ๋ก ๊ณ์ํด์ ํํฐ๋ followersOriginal ์์ ์งํํ๋๋ก ์ฝ๋๋ฅผ ์์ ํด์ฃผ์๋ค.
728x90
๋ฐ์ํ
'[๊ฐ๋ฐ] Practice > Vue.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Vue.js] Composition API ์ฌ์ฉํด๋ณด๊ธฐ (0) | 2022.04.09 |
---|---|
[Vue.js] Vuex4: mapState ์ฌ์ฉํ๊ธฐ (0) | 2022.04.08 |
[Vue.js] Vuex3: actions ํญ๋ชฉ ์ฌ์ฉํ๊ธฐ (0) | 2022.04.08 |
[Vue.js] Vuex2: ์ข์์ & ์ข์์ ์ทจ์ & ์ข์์ ์ฌ๋ถ ํ์ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ (0) | 2022.04.08 |
[Vue.js] Vuex1: Vuex ์ ํ ํ๊ธฐ (0) | 2022.04.07 |