P粉7275312372023-09-04 12:48:32
The following bindings to the toggle
function make no sense to me:
:toggleLeft="toggle('left')" :toggleRight="toggle('right')
This is an error since the function does not return any value.
These two bindings will cause infinite function calls toggle('left')
and toggle('right')
Just add console.log(direction)
to the toggle
function to see what's going on.
If you would like advice on the correct solution, please describe what you want to achieve.
Vue.component('toggle-buttons',{
props: {
leftSelectedInitially: {
type: Boolean,
default: true,
}
},
data() {
return {
leftSelected: true,
rightSelected: false,
}
},
beforeMount() {
//this.leftSelected = this.leftSelectedInitially;
//this.rightSelected = !this.leftSelectedInitially;
},
methods: {
toggle(override) {
console.log(`override: ${override}`)
this.leftSelected = override == 'left';
this.rightSelected = override == 'right';
}
},
template: `
<div role="list">
<div role="listitem">
<slot name="left" :is-selected="leftSelected" :toggleLeft="toggle('left')" />
</div>
<div role="listitem">
<slot name="right" :is-selected="rightSelected" :toggleRight="toggle('right')" />
</div>
</div>
`
});
new Vue({
el:'#app',
methods: {
toggle(direction) {
console.log(`direction: ${direction}`)
this.$refs.tb.toggle(direction);
}
}
})
#app { line-height: 2; }
[v-cloak] { display: none; }
<div id="app">
<toggle-buttons ref="tb">
<template v-slot:left="{ isSelected }">
<button
class="button"
:class="{ secondary: !isSelected }"
:aria-pressed="isSelected"
:togglable="true"
v-text="'left'"
@click="toggle('left')"
/>
</template>
<template v-slot:right="{ isSelected }">
<button
class="button"
:class="{ secondary: !isSelected }"
:aria-pressed="isSelected"
:togglable="true"
v-text="'right'"
@click="toggle('right')"
/>
</template>
</toggle-buttons>
</div>
<script src="https://unpkg.com/vue@2/dist/vue.min.js"></script>