๊ฒ์์ฐฝ์ ์๋ ๋ ๊ณณ์ ๋์๋ค.
- nav์์ ๊ฒ์
- SearchPage์์ ๊ฒ์
1. nav ๊ฒ์ ๊ธฐ๋ฅ
- nav์ ์๋ ๊ฒ์์ฐฝ์ keyword ์ ๋ ฅ(ํ์)
- ๊ฒ์ ๋ฒํผ ํด๋ฆญ
- search/keyword๋ก ์ด๋ํ๊ณ ๊ฒ์ ๊ฒฐ๊ณผ ์ถ๋ ฅ
<template>
<div id="nav">
<div class="menu-nav">
<div class="search-form">
<b-form-input
size="sm"
class="mr-sm-2"
type="text"
placeholder="๊ฒ์์ด๋ฅผ ์
๋ ฅํด์ฃผ์ธ์"
v-model="keyword" //keyword์ ๋ฐ์ธ๋ฉ
@keyup.enter="searchresultshow(keyword)" //์ํฐ ํด๋ฆญ์ searchresultshow ์คํ
></b-form-input>
<b-button
size="sm"
class="my-2 my-sm-0"
type="submit"
@click="searchresultshow(keyword)" //๋ฒํผ ํด๋ฆญ์ searchresultshow ์คํ
>
<b-icon icon="search"></b-icon>
</b-button>
</div>
</div>
</div>
</template>
<script>
export default {
name: "Nav",
data() {
return {
keyword: ''
}
},
methods: {
searchresultshow(keyword) {
if (keyword !== ''){ //๊ฒ์์ด๋ฅผ ์
๋ ฅํ ๊ฒฝ์ฐ
this.$router.push({
name: "SearchPage",
params: {
keyword: this.keyword,
isResultShow: true,
},
});
this.keyword = ''
console.log('"',keyword,'"' + ' ๊ฒ์')
} else {
alert('๊ฒ์์ด๋ฅผ ์
๋ ฅํด์ฃผ์ธ์!') //๊ฒ์์ด๋ฅผ ์
๋ ฅํ์ง ์์ ๊ฒฝ์ฐ
}
},
}
};
</script>
2. SearchPage ๊ฒ์ ๊ธฐ๋ฅ
- ๊ฒ์ ํ์ด์ง์ ์๋ ๊ฒ์์ฐฝ์ keyword ์ ๋ ฅ(ํ์)
- (๊ฒ์ ๋ฒํผ ํด๋ฆญ ์ ) result ํ๋ฉด ์จ๊ธฐ๊ธฐ
- (๊ฒ์ ๋ฒํผ ํด๋ฆญ ์) search/keyword๋ก ์ด๋ํ๊ณ ๊ฒ์ ๊ฒฐ๊ณผ ์ถ๋ ฅ
2-1) (์์ ์ปดํฌ๋ํธ) SeachPage.vue
<template>
<div id="searchpage">
<div id="searchrequire">
<div class="search-form-title">๊ฒ์์กฐ๊ฑด</div>
<div class="search-form-input">
<b-form-input id="input-default"
type="text"
v-model="keyword" //keyword์ ๋ฐ์ธ๋ฉ
v-on:input="keywordChanged()"
v-on:keyup.enter="searchresultshow(keyword)"
>
{{keyword}} //nav.vue์์ ๋ผ์ฐํฐ๋ฅผ ์ด์ฉํด ๋ณด๋ธ ํ๋ผ๋ฏธํฐ๋ก๋ถํฐ ๋ฐ์ดํฐ ๋ฐ์
</b-form-input>
</div>
<div class="search-form-button">
<button @click="searchresultshow(keyword)">
๊ฒ์
</button>
</div>
</div>
<SearchResult v-if="isResultShow" v-bind:keyword="keyword"></SearchResult> //ํ์ ์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ ์ ๋ฌ
<div v-else>
์์ง ๊ฒ์์ด๋ฅผ ์
๋ ฅํ์ง ์์์ต๋๋ค.
</div>
</div>
</template>
<script>
import SearchResult from "@/components/SearchResult.vue";
export default {
name: "SearchPage",
components: {
SearchResult
},
data() {
return {
isResultShow:true, //nav.vue์์ ๋ผ์ฐํฐ๋ฅผ ์ด์ฉํด ๋ณด๋ธ ํ๋ผ๋ฏธํฐ๋ก๋ถํฐ ๋ฐ์ดํฐ ๋ฐ์
keyword: this.$route.params.keyword //nav.vue์์ ๋ผ์ฐํฐ๋ฅผ ์ด์ฉํด ๋ณด๋ธ ํ๋ผ๋ฏธํฐ๋ก๋ถํฐ ๋ฐ์ดํฐ ๋ฐ์
}
},
methods: {
searchresultshow(keyword) {
console.log('"',keyword,'"' + ' ๊ฒ์')
if (keyword !== ''){
this.$router.push({
name: "SearchPage",
params: {
keyword: this.keyword
},
}).catch(()=>{});
this.isResultShow = true
} else {
alert('๊ฒ์์ด๋ฅผ ์
๋ ฅํด์ฃผ์ธ์!')
}
},
keywordChanged() {
this.isResultShow = false
}
}
};
</script>
2-2) (ํ์ ์ปดํฌ๋ํธ) SearchResult.vue
<template>
<div id="searchresult">
<div class="result-title">
์ด {{$store.getters.getFilteredProduct(keyword).length}}๊ฐ์ ์ํ์ด ๊ฒ์๋์์ต๋๋ค.
</div>
<div class="result-items">
<div
class="resultitem"
:key="index"
v-for="(product, index) in $store.getters.getFilteredProduct(keyword)"
@click="detailshow(index)"
>
<div class="product-img">
<img v-bind:src="product.productimg" />
</div>
<div class="product-info">
<li class="product-info-title">{{ product.title }}</li>
<li class="product-info-price">{{ product.price }}์</li>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "SearchResult",
props: [ 'keyword'], //์์ ์ปดํฌ๋ํธ์ธ SearchPage.vue๋ก๋ถํฐ ๋ฐ์ดํฐ ๋ฐ์
data() {
return {
}
},
methods: {}
}
</script>
2-3) ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค๋ getter์ถ๊ฐ (store/index.js)
getters: {
getFilteredProduct:(state) => (keyword) => {
const filtered = state.products.filter((object) =>
object.title.toLowerCase().includes(keyword.toLowerCase()) ||
object.description.toLowerCase().includes(keyword.toLowerCase()
));
if (filtered) return filtered;
},
},
'๐ก์น ํ๋ก์ ํธ > (ํ๋ก ํธ์๋) ๋ง์ผ์ปฌ๋ฆฌ - ํด๋ก ์ฝ๋ฉ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ฃผ์ ์ ๋ ฅ ๊ตฌํ(daum ์ฃผ์ api) (0) | 2021.08.04 |
---|---|
vuex ์ํ๋ณ ๋ฆฌ๋ทฐ ๋ทฐ์ด (0) | 2021.07.20 |
vuex ์ฅ๋ฐ๊ตฌ๋ ๊ตฌํ (0) | 2021.07.18 |
vuex ๋ฐ์ดํฐ ์ ๋ฌ(์์->ํ์) (0) | 2021.07.17 |
vue์ ๋ถํธ์คํธ๋ฉ ์ ์ฉ (0) | 2021.07.16 |