यह फायरबेस के साथ एक प्रतिक्रिया परियोजना से मेरा कोड है, मैं इस समस्या में सुबह से फंस गया हूं कृपया मेरी मदद करें

constructor (){
        super()
        this.state = {Message : false}
        this.Navigate = this.Navigate.bind(this)


        CompLoad = true

        var i = firebase.auth().currentUser.uid

        firebase.database().ref('users/' + i + '/inbox').limitToLast(1)

         .on('value' , function (x){

            if (CompLoad === false){

            var data = x.val()  

            alert(JSON.stringify(data))

            R = 'Inbox'

            this.Navigate()

            }

            if (CompLoad === true){
                CompLoad = false
            }


            })

            }

यह मुझे त्रुटि देता है: -

TypeError: Cannot read property 'Navigate' of null

नेविगेट फ़ंक्शन

Navigate =  () => {     
        this.context.router.history.push('/' + R)
    }

अगर मैं नेविगेट को सेटस्टेट से बदल दूं

this.setState({
                Message : true
            })

प्रतिक्रिया कहते हैं:

TypeError: Cannot read property 'setState' of null
0
Prince Hamza 1 अक्टूबर 2018, 13:17

4 जवाब

सबसे बढ़िया उत्तर

आपका कॉलबैक फ़ंक्शन this का संदर्भ बदल रहा है और अब यह class नहीं है।
एक प्राप्त करने के लिए या तो तीर फ़ंक्शन का उपयोग करें शाब्दिक संदर्भ:

 .on('value' , (x) => {
....

या अस्थायी रूप से कॉलबैक के ऊपर this मान रखें और उसका उपयोग करें:

// outside the callback in the constructor
const that = this;
// inside the callback
 .on('value' , function (x){
that.Navigate()
1
Sagiv b.g 1 अक्टूबर 2018, 13:22

यह पहुंच योग्य इकाई नहीं है और जब तक आप इसे बाध्य नहीं करते हैं या तीर फ़ंक्शन का उपयोग नहीं करते हैं।

इसे एरो फंक्शन में बदलें

    firebase.database().ref('users/' + i + '/inbox').limitToLast(1)

     .on('value' , (x) => {

        if (CompLoad === false){

        var data = x.val()  

        alert(JSON.stringify(data))

        R = 'Inbox'

        this.Navigate()

        }

        if (CompLoad === true){
            CompLoad = false
        }


        })

        }

या ऐसे बांधे

  firebase.database().ref('users/' + i + '/inbox').limitToLast(1)

     .on('value' , function (x){

        if (CompLoad === false){

        var data = x.val()  

        alert(JSON.stringify(data))

        R = 'Inbox'

        this.Navigate()

        }

        if (CompLoad === true){
            CompLoad = false
        }


        }.bind(this));

        }
1
Hemadri Dasari 1 अक्टूबर 2018, 13:21

आपको इस कॉलबैक को शाब्दिक दायरे का उपयोग करने के लिए बदलना चाहिए

.on('value' , function (x){
...

प्रति

.on('value' , (x) => {
...

लेक्सिकल स्कोपिंग पर और देखें

1
Manoz 1 अक्टूबर 2018, 13:22

सबसे पहले, आपको कंस्ट्रक्टर के अंदर वैरिएबल नहीं संपत्ति असाइन करनी चाहिए:

उदाहरण:

CompLoad = true // incorrect
this.CompLoad = true // correct

दूसरे, आपको कंस्ट्रक्टर के अंदर setState का उपयोग नहीं करना चाहिए।

तीसरा, अपने फ़ंक्शन के अंदर मूल संदर्भ this तक पहुंचने के लिए, आप बाइंड या तीर फ़ंक्शन

और अंत में, आप जो एपीआई क्रिया करना चाहते हैं और राज्य सेट करना चाहते हैं, तो आपको componentDidMount जीवनचक्र विधि और वहां से api को कॉल करें और आवश्यकतानुसार स्थिति को अपडेट करें।

0
Bhojendra Rauniyar 1 अक्टूबर 2018, 13:33