10/20
22013 ワード
Vueインフラストラクチャコースの復習
Ref : https://www.inflearn.com/course/vuejs/
1. $nextTick()
:コールバック関数をパラメータとして次のDOM更新サイクルに渡して実行します.データ変更後に使用する必要があります.
//Card.vue
<header slot="header" class="cardView__header">
//1. isEditTitle === true
<b-form-input
v-model="inputTitle"
placeholder="타이틀을 입력하세요:-)"
class="cardView__inputTitle"
v-if="isEditTitle"
ref="inputTitle"
></b-form-input>
//2. isEditTitle === false
<span class="cardView__title" v-else @click="setEditTitle">
{{card.title}}
</span>
</header>
//Card.vue methods
setEditTitle() {
this.isEditTitle = true;
this.inputTitle = this.card.title.trim();
//this.$refs.inputTitle.focus(); //1.
this.$nextTick(() => { //2.
this.$refs.inputTitle.focus();
});
}
//Card.vue
onEditCard() {
const listId = this.card.listId;
const title = this.inputTitle.trim();
//1.
const description = this.inputDesc.length ? this.inputDesc.trim() : null;
const id = this.cid;
//2.
if (!this.inputTitle.length) {
alert("카드 제목을 입력해주세요!");
//3.
this.inputTitle = this.card.title;
this.$nextTick(() => this.$refs.inputTitle.focus());
return false;
}
//4.
this.UPDATE_CARD({ id, title, listId, description })
.catch((err) => console.error(err))
.finally(() => {
this.restoreEdit();
//7.
this.fetchData();
});
},
//actions.js
UPDATE_CARD({ dispatch, state }, { id, title, description, listId, pos }) {
//5.
const payload = { title, description, listId, pos };
return api.card
.update({ id, payload })
.then(() => {
//6.
dispatch("FETCH_BOARD", { id: state.board.id });
})
.catch((err) => Promise.reject(err));
},
3.カードのドラッグ&ドロップを実施する
使用ライブラリ:https://github.com/SortableJS/Vue.Draggable
使用例
//List.vue
<draggable
class="list-item__cardList list-group" //1.
:list="data.cards" //2.
:data-list-id="data.id"
draggable=".card-item" //3.
group="cardItem" //4.
@end="onEnd" //5.
>
<card-item
v-for="card in data.cards"
:data="card"
:key="card.pos"
/>
</draggable>
onEnd(event) {
//1. 2.
const { to, item } = event;
const listId = to.dataset.listId;
const currentCard = {
id: item.dataset.cardId * 1,
pos: 65535,
listId: listId * 1,
};
},
=>*注意事項:「.card-item」、ドラッグするエンティティの:キーが重複してエラーが発生した場合、itemを正しく選択できません!!
//AddCard.vue
const pos = this.getPos();
getPos() {
//1.
const list = this.board.lists.filter(
(b) => b.id === this.listId
)[0];
//2.
const lastCard = list.cards[list.cards.length - 1];
//3.
return lastCard ? lastCard.pos * 2 : 65535;
}
講義で使用する方法を現在のライブラリと組み合わせて使用する予定です.
* Reference
1. Vue.nextTick : https://kr.vuejs.org/v2/api/index.html#Vue-nextTick
Reference
この問題について(10/20), 我々は、より多くの情報をここで見つけました https://velog.io/@kyh196201/1020テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol