Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

can't access data variables in watch handler vuejs

I'm trying to set a data variable in a watch handler function for an input field in a VueJs Component. I have something like this:

data() {
    return {
        params: {
            // default params to 1 month
            from: new Date().setMonth(new Date().getMonth() - 1),
            to: Date.now(),
            skip: 0,
            limit: 100
        }
    }
}
watch: {
    dates: { 
        handler: date => {
            console.log(this.params)
            if (date.start) {
                this.params.from = moment(date.start, "YYYY/MM/DD")
            }
            if (date.end) {
                this.params.to = moment(date.end, "YYYY/MM/DD")
            }
        },
        deep: true
    }
}

When I set an input for the dates variable in the view template, I get an undefined for this.params in the console log, and I get an error for trying to set this.params.from. So I tried accessing it using a method:

methods: {
    printParams() {
        console.log(this.params)
    }
}

calling it in the view template, it correctly resolves the params object.

Am I missing something here?

like image 999
Wildan Maulana Syahidillah Avatar asked Apr 27 '17 07:04

Wildan Maulana Syahidillah


People also ask

What is Watcher in Vue JS?

Vue.js has a special feature, i.e. Watcher, which helps one to keep track of a property of the component state and a function is run when the value of property changes. Watcher makes a code very simple and fast as it takes care of any change in data. Watchers are used to seeing the changes in the data occurring in the reactive properties.

What is data () in Vue JS?

Basically in vue.js data () we defined collection of logic and stored in component using vue.js we can access data Node.jsassociated with a vue instance. Components are reusable as many times as per requirement.

How many times can we reuse a component in Vue JS?

Components are reusable as many times as per requirement. But each time it uses a separate component and also creates a new instance. When we use a data function at that time each instance maintains a separate copy of the return data object. Most of vue.js uses API to fetch and post data.

What happens when you mutate reactive state in Vue?

} When you mutate reactive state, it may trigger both Vue component updates and watcher callbacks created by you. By default, user-created watcher callbacks are called before Vue component updates. This means if you attempt to access the DOM inside a watcher callback, the DOM will be in the state before Vue has applied any updates.


2 Answers

To avoid additional binding, just avoid using the arrow function syntax here.Instead go with ES6 Object shorthands:

watch: {
    dates: { 
        handler(date) {
            console.log(this.params)
            if (date.start) {
                this.params.from = moment(date.start, "YYYY/MM/DD")
            }
            if (date.end) {
                this.params.to = moment(date.end, "YYYY/MM/DD")
            }
        },
        deep: true
    }
}

Now this will be bound to the correct context by default.

like image 142
Belmin Bedak Avatar answered Oct 19 '22 23:10

Belmin Bedak


Let's try bind this to your handler

        handler(date) {
            console.log(this.params)
            if (date.start) {
                this.params.from = moment(date.start, "YYYY/MM/DD")
            }
            if (date.end) {
                this.params.to = moment(date.end, "YYYY/MM/DD")
            }
        }.bind(this)
like image 30
taile Avatar answered Oct 20 '22 00:10

taile