Edit : После прочтения комментариев, в которых вы полагаетесь на localstorage, я могу только предложить вам принять подход Vuex и использовать библиотеку постоянства для обработки localstorage. ( https://www.npmjs.com/package/vuex-persist) Таким образом, ваше локальное хранилище всегда будет связано с вашим приложением, и вам не придется каждый раз связываться с getItem / setItem.
Глядя на ваш подход, я предполагаю, что вы есть причины использовать вычисляемое свойство вместо свойства данных.
Проблема возникает из-за того, что вычисляемое свойство возвращает объект, определенный нигде, кроме как в обработчике get
. Что бы вы ни пытались, вы не сможете управлять этим объектом в обработчике set
.
get
и set
должны быть связаны с общей ссылкой. Свойство данных, как многие предлагали, или источник истины в вашем приложении (очень хороший пример - экземпляр Vuex).
Таким образом, ваш v-model
будет безупречно работать с set
обработчиком ваше вычисленное свойство.
Вот рабочая скрипка, демонстрирующая объяснение:
С Vuex
const store = new Vuex.Store({
state: {
// your options object is predefined in the store so Vue knows about its structure already
options: {
isChecked: false
}
},
mutations: {
// the mutation handler assigning the new value
setIsCheck(state, payload) {
state.options.isChecked = payload;
}
}
});
new Vue({
store: store,
el: "#app",
computed: {
options: {
get() {
// Here we return the options object as depicted in your snippet
return this.$store.state.options;
},
set(checked) {
// Here we use the checked property returned by the input and we commit a Vuex mutation which will mutate the state
this.$store.commit("setIsCheck", checked);
}
}
}
})
body {
background: #20262E;
padding: 20px;
font-family: Helvetica;
}
#app {
background: #fff;
border-radius: 4px;
padding: 20px;
transition: all 0.2s;
}
h2 {
font-weight: bold;
margin-bottom: 15px;
}
<div id="app">
<h2>isChecked: {{ options.isChecked }}</h2>
<input type="checkbox" v-model="options.isChecked" />
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<script src="https://unpkg.com/vuex@2.0.0"></script>
Со свойством данных
new Vue({
el: "#app",
data: {
options: {
isChecked: false
}
},
computed: {
computedOptions: {
get() {
return this.options;
},
set(checked) {
this.options.isChecked = checked;
}
}
}
})
body {
background: #20262E;
padding: 20px;
font-family: Helvetica;
}
#app {
background: #fff;
border-radius: 4px;
padding: 20px;
transition: all 0.2s;
}
h2 {
font-weight: bold;
margin-bottom: 15px;
}
<div id="app">
<h2>isChecked: {{ computedOptions.isChecked }}</h2>
<input type="checkbox" v-model="computedOptions.isChecked" />
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
Ваш подход немного особенный ИМХО, но, опять же, у вас должны быть причины для этого.