vue.js 템플릿 구성 요소를 사용하기 위해 v-에서 생성한 목록 항목에 클릭 시 클래스를 바인딩하려면 어떻게 해야 합니까?
템플릿 컴포넌트의 목록 항목에 활성 클래스를 적용하려고 합니다.클릭 시 해당 클래스는 제외되며 다른 모든 목록 항목에서 삭제됩니다.
새로운 데이터 오브젝트를 클릭해서 전달해 보았습니다만, 공식 문서의 예제를 사용해 본 적도 있습니다만, 왜 동작하지 않는지를 알 수 없습니다.
Vue.component('delivery-options', {
props: ['deliveries'],
template: '<li><p><strong>{{ deliveries.price }}</strong>{{ deliveries.title }}</p><p>{{ deliveries.desc }}</p></li>'
})
Vue.component('ledger', {
props: ['values'],
template: '<li><p>{{ values.title }}<span>{{ values.price }}</span></p></li>'
})
var checkout = new Vue({
el: '#checkout-app',
data: {
deliveryList: [
{ id: 0, price: '£3.99 ', title: 'Home delivery', desc: 'Lorem ipsum dolor sit amet.' },
{ id: 1, price: 'Free ', title: 'Store collection', desc: 'Lorem ipsum dolor sit amet.' },
{ id: 2, price: '£5.99 ', title: 'Precise delivery', desc: 'Lorem ipsum dolor sit amet.' }
],
valuesList: [
{ id: 0, price: '£1233.99', title: 'Order value', desc: 'Lorem ipsum dolor sit amet.' },
{ id: 1, price: '£3.99', title: 'Delivery', desc: 'Lorem ipsum dolor sit amet.' },
{ id: 2, price: '£5.99', title: 'Total', desc: 'Your total including delivery.' }
]
}
})
ul {
padding: 0;
}
ul li {
list-style-type: none;
}
.delivery-options li {
padding: 1rem;
margin: 1rem;
border-radius: 3px;
border: 1px solid grey;
}
.ledger {
padding: 1rem;
margin: 1rem;
border-radius: 3px;
border: 1px solid grey;
}
<script src="https://unpkg.com/vue"></script>
<div id="checkout-app">
<ul class="delivery-options">
<delivery-options
v-for="option in deliveryList"
v-bind:deliveries="option"
v-bind:key="option.id">
</delivery-options>
</ul>
<ul class="ledger">
<ledger
v-for="value in valuesList"
v-bind:values="value"
v-bind:key="value.id">
</ledger>
</ul>
</div>
다음과 같은 작업을 수행해야 합니다.
console.clear()
Vue.component('delivery-options', {
props: ['deliveries', "isActive"],
template: `<li @click="$emit('set-active', deliveries)" :class="{active: isActive}"><p><strong>{{ deliveries.price }}</strong>{{ deliveries.title }}</p><p>{{ deliveries.desc }}</p></li>`
})
Vue.component('ledger', {
props: ['values'],
template: '<li><p>{{ values.title }}<span>{{ values.price }}</span></p></li>'
})
var checkout = new Vue({
el: '#checkout-app',
data: {
activeDelivery: null,
deliveryList: [
{ id: 0, price: '£3.99 ', title: 'Home delivery', desc: 'Lorem ipsum dolor sit amet.' },
{ id: 1, price: 'Free ', title: 'Store collection', desc: 'Lorem ipsum dolor sit amet.' },
{ id: 2, price: '£5.99 ', title: 'Precise delivery', desc: 'Lorem ipsum dolor sit amet.' }
],
valuesList: [
{ id: 0, price: '£1233.99', title: 'Order value', desc: 'Lorem ipsum dolor sit amet.' },
{ id: 1, price: '£3.99', title: 'Delivery', desc: 'Lorem ipsum dolor sit amet.' },
{ id: 2, price: '£5.99', title: 'Total', desc: 'Your total including delivery.' }
]
},
})
ul {
padding: 0;
}
ul li {
list-style-type: none;
}
.delivery-options li {
padding: 1rem;
margin: 1rem;
border-radius: 3px;
border: 1px solid grey;
}
.ledger {
padding: 1rem;
margin: 1rem;
border-radius: 3px;
border: 1px solid grey;
}
.active {
color: red
}
<script src="https://unpkg.com/vue"></script>
<div id="checkout-app">
<ul class="delivery-options">
<delivery-options
v-for="option in deliveryList"
v-bind:deliveries="option"
v-bind:key="option.id"
v-bind:is-active="option === activeDelivery"
v-on:set-active="v => activeDelivery = v">
</delivery-options>
</ul>
<ul class="ledger">
<ledger
v-for="value in valuesList"
v-bind:values="value"
v-bind:key="value.id">
</ledger>
</ul>
</div>
기본적으로 데이터 속성을 사용하여 활성 전송을 추적한 다음 활성 전송인지 여부에 따라 구성 요소에서 클래스를 설정합니다.활성 전달을 클릭 시 설정하려면 구성 요소는 부모에게 클릭된 전달을 알리는 이벤트를 내보내야 합니다.
언급URL : https://stackoverflow.com/questions/47638418/vue-js-how-do-i-bind-a-class-on-click-to-a-list-item-created-by-v-for-utilising
'programing' 카테고리의 다른 글
VUEJS의 URL에서 ID 가져오기 (0) | 2022.08.25 |
---|---|
Java에서 한 디렉토리에서 다른 디렉토리로 파일 복사 (0) | 2022.08.25 |
비밀번호로 String보다 char[]가 선호되는 이유는 무엇입니까? (0) | 2022.08.24 |
어레이 이름이 포인터입니까? (0) | 2022.08.24 |
Java에서 2 * (i * i)가 2 * i * i보다 빠른 이유는 무엇입니까? (0) | 2022.08.21 |