Timepicker Nativescript Vue con Vuex
Sto lavorando a un'app Nativescript-Vue e sto cercando di utilizzare Vuex per memorizzare l'ora e i minuti da un Timepicker da utilizzare in altre pagine. Ho provato a catturare l'evento con una proprietà calcolata, ma c'è un modo migliore per farlo con Vue?
Ecco cosa ho:
// 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)
}
},
},
Quindi, nel mio negozio 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: {
}
});
Sembra che i valori predefiniti dallo Store vengano inseriti correttamente nel componente, ma quando si modifica l'ora nel selettore, la parte "set" della funzione calcolata non viene mai attivata e non vedo mai l'attivazione di console.logs.
Dovrei ascoltare un evento di cambiamento diverso? La documentazione qui non entra nei dettagli su questo molto.
Grazie per l'aiuto!
Risposte
Poiché tutti gli oggetti di scena in Vue sono unidirezionali, Timepicker
vengono utilizzati solo per impostare i valori iniziali.
Invece, puoi usare un'associazione v-model
con un getter e un setter calcolati che legge / scrive nel tuo negozio
<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())
}
}
}
}
In alternativa, per ascoltare gli aggiornamenti, è necessario utilizzare l' 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())
}
}
}