Vue with DRF
Article Read
- ์๋ต ๋ฐ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ ํ์ธ
โ dataArray์ ๊ฐ ๊ฒ์๊ธ ๊ฐ์ฒด
โ ๊ฐ ๊ฒ์๊ธ ๊ฐ์ฒด๋ id, title, content๋ก ๊ตฌ์ฑ
- store/index.js ์์
// store/index.js
export default new Vuex.Store({
state: {
articles: [],
},
getters: {
},
mutations: {
GET_ARTICLES(state, articles) {
state.articles=articles
}
},
actions: {
getArticles(context) {
axios({
method: 'get',
url: `${API_URL}/api/v1/articles/`
})
.then((res) => {
// console.log(res, context)
context.commit('GET_ARTICLES', res.data)
})
.catch((err) => {
console.log(err)
})
}
})
- ๊ฒฐ๊ณผ ํ์ธ
Article Create
views/CreateView.vue
์ฝ๋ ํ์ธ
// views/CreateView.vue
<template>
<div>
<h1>๊ฒ์๊ธ ์์ฑ</h1>
<form @submit.prevent='createArticle'>
<label for="title">์ ๋ชฉ : </label>
<input type="text" id="title" v-model.trim="title"><br>
<label for="content">๋ด์ฉ : </label>
<textarea id="content" cols="30" rows="10" v-model="content"></textarea><br>
<input type="submit" id="submit">
</form>
</div>
</template>
โ v-model.trim
์ ํ์ฉํด ์ฌ์ฉ์ ์
๋ ฅ์์ ๋ฐ์ดํฐ ๊ณต๋ฐฑ ์ ๊ฑฐ
โ .prevent
ํ์ฉํด form์ ๊ธฐ๋ณธ ์ด๋ฒคํธ ๋์ ๋ง๊ธฐ
views/CreateView.vue
์ฝ๋ ํ์ธ
<script>
export default {
name: 'CreateView',
data() {
},
methods: {
createArticle() {
const title = this.title
const content = this.content
if (!title) {
alert('์ ๋ชฉ์ ์
๋ ฅํด์ฃผ์ธ์')
return
} else if (!content) {
alert('๋ด์ฉ์ ์
๋ ฅํด์ฃผ์ธ์')
return
}
}
}
}
</script>
โ title, content๊ฐ ๋น์๋ค๋ฉด alert๋ฅผ ํตํด ๊ฒฝ๊ณ ์ฐฝ์ ๋์ฐ๊ณ AJAX ์์ฒญ์ ๋ณด๋ด์ง ์๋๋ก return ์์ผ ํจ์๋ฅผ ์ข ๋ฃ
views/CreateView.vue
์ฝ๋ ํ์ธ
// views/CreateView.vue
<script>
import axios from 'axios'
const API_URL = 'http://127.0.0.1:8000'
export default {
name: 'CreateView',
methods: {
createArticle() {
const title = this.title
const content = this.content
if (!title) {
alert('์ ๋ชฉ์ ์
๋ ฅํด์ฃผ์ธ์')
return
} else if (!content) {
alert('๋ด์ฉ์ ์
๋ ฅํด์ฃผ์ธ์')
return
}
axios({
method: 'post',
url: `${API_URL}/api/v1/articles/`,
data: {
title: title,
content: content
}
})
.then((res) => {
console.log(res)
})
.catch((err) => {
console.log(err)
})
}
}
}
</script>
โ axios๋ฅผ ์ฌ์ฉํด server์ ๊ฒ์๊ธ ์์ฑ ์์ฒญ
โ state๋ฅผ ๋ณํ ์ํค๋ ๊ฒ์ด ์๋ DB์ ๊ฒ์๊ธ ์์ฑ ํ ArticleView๋ก ์ด๋ํ ๊ฒ์ด๋ฏ๋ก methods์์ ์ง์ ์ฒ๋ฆฌ
router/index.js
// router/index.js
import CreateView from '@/views/CreateView'
Vue.use(VueRouter)
const routes = [
...
{
path: '/create',
name: 'CreateView',
component: CreateView
},
...
]
views/ArticleView.vue
<template>
<div>
<h1>Article Page</h1>
<router-link :to="{ name: 'CreateView' }">[CREATE]</router-link>
<hr>
<ArticleList/>
</div>
</template>
โ router-link๋ฅผ ํตํด CreateView๋ก ์ด๋
views/CreateView.vue
// views/CreateView.vue
<script>
import axios from 'axios'
const API_URL = 'http://127.0.0.1:8000'
export default {
name: 'CreateView',
methods: {
createArticle() {
const title = this.title
const content = this.content
if (!title) {
alert('์ ๋ชฉ์ ์
๋ ฅํด์ฃผ์ธ์')
return
} else if (!content) {
alert('๋ด์ฉ์ ์
๋ ฅํด์ฃผ์ธ์')
return
}
axios({
method: 'post',
url: `${API_URL}/api/v1/articles/`,
data: {
title: title,
content: content
}
})
.then(() => {
this.$router.push({name: 'ArticleView'})
})
.catch((err) => {
console.log(err)
})
}
}
}
</script>
โ ๊ฒ์๊ธ ์์ฑ ์๋ฃ ํ ArticleView๋ก ์ด๋
โ ์๋ต ํ์ธ์ ์ํด ์ ์ํ ์ธ์ res
์ ๊ฑฐ
- ๊ฒฐ๊ณผ ํ์ธ
โ ArticleView
๊ฐ create๋ ๋๋ง๋ค server์ ๊ฒ์๊ธ ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๊ธฐ ๋๋ฌธ์ router๋ง ์ด๋ํด๋ ๋ณด์ธ๋ค.
[์ฐธ๊ณ ] ์ง๊ธ ์์ฒญ ๋ฐฉ์์ด ๊ณผ์ฐ ํจ์จ์ ์ธ๊ฐ?
โ ์ ์ฒด ๊ฒ์๊ธ ์ ๋ณด๋ฅผ ์์ณฅํด์ผ ์๋ก ์์ฑ๋ ๊ฒ์๊ธ์ ํ์ธํ ์ ์๋ค.
โ vuex state๋ฅผ ํตํด ์ ์ฒด ๊ฒ์๊ธ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๋๋ก ๊ตฌ์ฑํ๋ค๋ฉด...?
โ ๋ ์ด์ธ ์ ์ ๋ค์ด ์๋กญ๊ฒ ์์ฑํ ๊ฒ์๊ธ์ ์ธ์ ๋ถ๋ฌ์์ผ ํ๋๊ฐ...?
Article Detail
views/DetailView.vue
<template>
<div>
<h1>Detail</h1>
<!-- <p>๊ธ ๋ฒํธ : {{ article?.id }}</p>
<p>์ ๋ชฉ : {{ article?.title }}</p>
<p>๋ด์ฉ : {{ article?.content }}</p>
<p>์์ฑ์๊ฐ : {{ article?.created_at }}</p>
<p>์์ ์๊ฐ : {{ article?.updated_at }}</p> -->
</div>
</template>
<script>
export default {
name: 'DetailView',
data() {
},
created() {
},
methods: {
}
}
</script>
โ ๊ฒ์๊ธ ์์ธ ์ ๋ณด๋ฅผ ํํํ ์ปดํฌ๋ํธ
โ AJAX ์์ฒญ์ผ๋ก ์๋ต ๋ฐ์์ฌ article์ ์์ธ ์ ๋ณด๋ค์ ํํ
router/index.js
๋ฑ๋ก
// router/index.js
..
import DetailView from '@/views/DetailView'
...
Vue.use(VueRouter)
const routes = [
...
{
path: '/:id',
name: 'DetailView',
component: DetailView,
},
]
โ id๋ฅผ ๋์ ์ธ์๋ก ๋ฐ์ ํน์ ๊ฒ์๊ธ์ ๋ํ ์์ฒญ
components/ArticleListItem.vue
// compoents/ArticleListItem.vue
<template>
<div>
<h5>{{ article.id }}</h5>
<p>{{ article.title }}</p>
<router-link
:to="{
name: 'DetailView',
params: { id: article.id }
}"
>
[DETAIL]
</router-link>
<hr>
</div>
</template>
<script>
export default {
name: 'ArticleListItem',
props: {
article: Object
}
}
</script>
โ router-link๋ฅผ ํตํด ํน์ ๊ฒ์๊ธ์ id๊ฐ์ ๋์ ์ธ์๋ก ์ ๋ฌ
โ ๊ฒ์๊ธ ์์ธ ์ ๋ณด๋ฅผ server์ ์์ฒญ
views/DetailView.vue
// views/DetailView.vue
<script>
import axios from 'axios'
const API_URL = 'http://127.0.0.1:8000'
export default {
name: 'DetailView',
created() {
this.getArticleDetail()
},
methods: {
getArticleDetail() {
axios({
method: 'get',
url: `${API_URL}/api/v1/articles/${this.$route.params.id}/`
})
.then((res) => {
console.log(res)
})
.catch((err) => {
console.log(err)
})
}
}
}
</script>
โ this.$route.params
๋ฅผ ํ์ฉํด ์ปดํฌ๋ํธ๊ฐ create๋ ๋ ๋๊ฒจ๋ฐ์ id๋ก ์์ธ ์ ๋ณด AJAX ์์ฒญ
- ์์ฒญ ๊ฒฐ๊ณผ ํ์ธ
views/DetailView.vue
์์
// views/DetailView.vue
<template>
<div>
<h1>Detail</h1>
<p>๊ธ ๋ฒํธ : {{ article?.id }}</p>
<p>์ ๋ชฉ : {{ article?.title }}</p>
<p>๋ด์ฉ : {{ article?.content }}</p>
<p>์์ฑ์๊ฐ : {{ article?.created_at }}</p>
<p>์์ ์๊ฐ : {{ article?.updated_at }}</p>
</div>
</template>
<script>
import axios from 'axios'
const API_URL = 'http://127.0.0.1:8000'
export default {
name: 'DetailView',
data() {
return {
article:null
}
},
created() {
this.getArticleDetail()
},
methods: {
getArticleDetail() {
axios({
method: 'get',
url: `${API_URL}/api/v1/articles/${this.$route.params.id}/`
})
.then((res) => {
this.article=res.data
})
.catch((err) => {
console.log(err)
})
}
}
}
</script>
โ ์๋ต ๋ฐ์ ์ ๋ณด๋ฅผ data์ ์ ์ฅ
โ data์ ๋ด๊ธฐ๊น์ง ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ฏ๋ก optional chaining์ ํ์ฉํด ๋ฐ์ดํฐ ํ๊ธฐ
- ๊ฒฐ๊ณผ ํ์ธ
'โญ Personal_Study > Vue' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
DRF Auth with Vue (0) | 2022.11.23 |
---|---|
DFR Auth System (0) | 2022.11.22 |
Cross - Origin Resource Sharing (CORS) (0) | 2022.11.20 |
Vue with DRF: Server & Client (0) | 2022.11.20 |
Article with Vue (0) | 2022.11.19 |
๋๊ธ