React-Native之undefined is not an object

来源:互联网 发布:cf湖北一区阿玛尼网络 编辑:程序博客网 时间:2024/06/03 20:17

刚学习rn,有很多不理解的地方,常常会报undefined is not an object这个错,然后在不断的修改和试错的情况下
,发现只要发生这个情况就有this存在,先贴出一段错误的代码

export default class Test extends Component {    constructor(props) {        super(props)        this.state = {            header: "我是header",            _data: [                {key: 'a'},                {key: 'b'},                {key: 'c'},                {key: 'd'},                {key: 'd'},            ]        }    }    _header() {        return (            <Text style={{backgroundColor: "red", height: 100,}}>                {this.state.header}            </Text>        );    }    render() {        return (            <View>                <FlatList                    ListHeaderComponent={this._header}//header头部组件                    data={this.state._data}                    renderItem={({item}) => <Text style={{alignSelf: "center", flex: 1, height: 30}}>{item.key}</Text>}                />            </View>        );    }}

报错如图

这里写图片描述

说是this.state.header这地方错误,刚接触这些很郁闷,引用state里面的值不都是这么引入的吗,
我试着写了个简单的demo

export default class Test extends Component {    constructor(props) {        super(props)        this.state = {            header: "我是header",        }    }    render() {        return (            <View>                <Text>{this.state.header}</Text>            </View>        );    }}

完全是可以的,这让我这个初入rn的初学者头疼了,后来我想,会不会和这个this有关呢,
我试着删除{this.state.header},随便加点固定值,是完全可以的,后来我想,这个_header函数是FlatList组件的
一个子组件,会不会是_header()函数的this指向的是FlatList组件呢?我要如何拿到全局的this呢?
后来看了下资料,找到了解决方法,就是给_header()函数绑定全局的this,默认的this是指向是父组件的

export default class Test extends Component {    constructor(props) {        super(props)        this.state = {            header: "我是header",            _data: [                {key: 'a'},                {key: 'b'},                {key: 'c'},                {key: 'd'},                {key: 'd'},            ]        }        //将全局的this绑定到_header函数        this._header=this._header.bind(this)    }    _header() {        return (            <Text style={{backgroundColor: "red", height: 100,}}>                {this.state.header}            </Text>        );    }    render() {        return (            <View>                <FlatList                    ListHeaderComponent={this._header}//header头部组件                    data={this.state._data}                    renderItem={({item}) => <Text style={{alignSelf: "center", flex: 1, height: 30}}>{item.key}</Text>}                />            </View>        );    }}

这里写图片描述

总结

1、子组件指向的this属于子组件,与父组件无关
2、子组件不能去父组件更新状态
3、如果要在子组件更新父组件的状态,给子组件绑定父组件的this

阅读全文
0 0
原创粉丝点击