javascript - Skicka värdet från räckviddsinmatning vid ändring i Vue 2


I Vue 2: Jag har en App-komponent, som har en Slider-komponent:

App.vue

<template>
    <div>
        <Slider :foo="store.foo"></Slider>
    </div>
</template>

<script>
    import store from './components/store.js';
    import Slider from './components/Slider.vue';

    export default {
        name: 'app',

        components: { Slider },

        data() { 
            return {
                store: store
            }
        },

        methods: {
            changeFoo(foo) {
                console.log('change!', foo);
            },
        },
    }
</script>

Slider.vue

<template>
    <div>
        <input type="range" min="1" max="100" step="1" @change="changeFoo" />
    </div>
</template>

<script>
    export default {
        props: ['foo'],
        methods: {
            changeFoo() {
                this.$emit('changeFoo', foo);
            }
        }
    }
</script>

Problemet är att värdet på reglaget inte skickas i emit-satsen i Slider.vue. Jag kan se varför - men jag är inte säker på hur man åtgärdar det. Jag försökte göra:

v-model="foo"

i input-elementet, men Vue ger en varning om att jag inte får ändra props.

Svar #1

Istället för att använda prop, skapa en ny datavariabel för reglaget och skicka denna variabel i emit, så här:

<template>
    <div>
        <input v-model="sliderVal" type="range" min="1" max="100" step="1" @change="changeFoo" />
    </div>
</template>

<script>
    export default {
        props: ['foo'],
        data: function() {
           return {
              sliderVal: ""
           }
        }
        methods: {
            changeFoo() {
                this.$emit('changeFoo', this.sliderVal);
            }
        }
    }
</script>

Även i App.vue måste du lyssna på denna emitterade händelse på följande sätt:

<template>
    <div>
        <Slider :foo="store.foo" @change-foo="changeFoo"></Slider>
    </div>
</template>