Nativescript Vue Timepicker con Vuex
Estoy trabajando en una aplicación Nativescript-Vue y estoy tratando de usar Vuex para almacenar la hora y los minutos de un Timepicker para usar en otras páginas. Intenté capturar el evento con una propiedad calculada, pero ¿hay una mejor manera de hacerlo con Vue?
Esto es lo que tengo:
// In NotifyTimePicker.vue (a custom Time-picking modal)
// Template:
<TimePicker row="2" col="0" colSpan="3" horizontalAlignment="center" :hour="selectedFromHour" :minute="selectedFromMinute" />
//Script
computed: {
selectedFromHour: {
get: function () {
return this.$store.state.notifyFromTimeHour }, set: function (newValue) { console.log(`Attempting to Update Store with new From Hour = ${newValue}`)
this.$store.commit('changeNotifyFromTimeHour', newValue) } }, selectedFromMinute: { get: function () { return this.$store.state.notifyFromTimeMinute
},
set: function (newValue) {
console.log(`Attempting to Update Store with new From Minute = ${newValue}`) this.$store.commit('changeNotifyFromTimeMinute', newValue)
}
},
},
Luego, en mi tienda Vuex:
export default new Vuex.Store({
state: {
notifyFromTimeHour: 9,
notifyFromTimeMinute: 30,
},
mutations: {
changeNotifyFromTimeHour (state, hour) {
state.notifyFromTimeHour = hour
},
changeNotifyFromTimeMinute (state, minute) {
state.notifyFromTimeMinute = minute
},
},
actions: {
}
});
Parece que los valores predeterminados de la Tienda se introducen en el componente sin problemas, pero cuando se cambia la hora en el selector, la parte 'set' de la función calculada nunca se activa y nunca veo que mi console.logs se active.
¿Debería estar escuchando un evento de cambio diferente? La documentación aquí no entra en detalles sobre esto.
¡Gracias por la ayuda!
Respuestas
Dado que todos los accesorios en Vue son unidireccionales, los Timepickeraccesorios solo se usan para establecer valores iniciales.
En su lugar, se puede utilizar una v-modelunión con una computarizada getter y setter , que se lee de escritura / a su tienda
<TimePicker
row="2"
col="0"
colSpan="3"
horizontalAlignment="center"
v-model="selectedTime"
/>
export default {
computed: {
selectedTime: {
get () {
const time = new Date()
time.setHours(
this.$store.state.notifyFromTimeHour, this.$store.state.notifyFromTimeMinute)
return time
},
set (time) {
this.$store.commit('changeNotifyFromTimeHour', time.getHours()) this.$store.commit('changeNotifyFromTimeMinute', time.getMinutes())
}
}
}
}
Alternativamente, para escuchar actualizaciones, debe usar el timeChangeevento
<TimePicker
row="2"
col="0"
colSpan="3"
horizontalAlignment="center"
:hour="selectedFromHour"
:minute="selectedFromMinute"
@timeChange="changeTime"
/>
import { mapState } from "vuex"
export default {
computed: mapState({
selectedFromHour: "notifyFromTimeHour",
selectedFromMinute: "notifyFromTimeMinute"
}),
methods: {
changeTime (payload) {
// documentation doesn't say what the event payload is, let's assume it's a Date
this.$store.commit('changeNotifyFromTimeHour', payload.getHours()) this.$store.commit('changeNotifyFromTimeMinute', payload.getMinutes())
}
}
}