React Native新手:Firebase Promise取值失败且setState报错求助
解决React Native中Promise回调里setState报错的问题
嘿,我一眼就看出你遇到的问题啦!这个TypeError: _this2.setState is not a function错误,本质是JavaScript普通函数的this上下文绑定问题——在GeoFire的事件回调和Promise的then回调里,你用了普通的function(),它的this并没有指向你的React组件实例,自然找不到setState方法。
核心解决方案:用箭头函数替代普通函数
箭头函数不会创建自己的this,它会继承外层作用域的this(也就是你的组件实例),这样就能正常调用setState了。我帮你修改了代码里的关键部分:
_getActivites() { const latitude = 42.297761; const longitude = 4.636235; const radius = 5; var keys = []; var activitesToState = []; const firebaseRef = firebase.database().ref("activites_locations/"); const geoFire = new GeoFire(firebaseRef); var geoQuery; var activites = []; geoQuery = geoFire.query({ center: [latitude, longitude], radius: radius }); geoQuery.on("key_entered", (key, location, distance) => { // 改成箭头函数 keys.push(key); }); geoQuery.on("ready", () => { // 改成箭头函数 var promises = keys.map((key) => { // 改成箭头函数 return firebaseRef.child(key).once("value"); }); Promise.all(promises).then((snapshots) => { snapshots.forEach((snapshot) => { // 改成箭头函数 activites.push(snapshot.val()); }); this.setState({ activitesState: activites }) }).catch((error) => { console.log(error); }); }); }; componentDidMount() { firebase.auth().signInAnonymously() .then(() => { this.setState({ isAuthenticated: true }); }); this._getActivites(); }
额外提醒
如果你的_getActivites方法本身也出现this指向问题(比如调用时this不是组件实例),可以在组件的构造函数里手动绑定:
constructor(props) { super(props); this.state = { activitesState: [], isAuthenticated: false }; this._getActivites = this._getActivites.bind(this); // 绑定方法的this到组件实例 }
这样修改后,回调里的this就会正确指向你的React组件,setState就能正常工作啦!
内容的提问来源于stack exchange,提问作者jeanjohny
相关产品推荐
相关产品推荐

