React-Native:无法访问状态值或从 renderRow 声明的任何方法

Posted

技术标签:

【中文标题】React-Native:无法访问状态值或从 renderRow 声明的任何方法【英文标题】:React-Native: Cannot access state values or any methods declared from renderRow 【发布时间】:2016-11-10 19:07:57 【问题描述】:

我有一个列表视图,每当用户点击一个项目时,我想用 onPress(可触摸的突出显示)做一些事情。

我尝试定义函数然后在 onPress 中调用它们,但它们不起作用。

首先我定义了一个这样的函数:

constructor(props) 
        super(props);
        this.state = 
          dataSource: new ListView.DataSource(
            rowHasChanged: (row1, row2) => row1 !== row2,
          ),
          loaded: false,
        ;
        this._dosome = this._dosome.bind(this);
    

    _dosome(dd)
      console.log(dd);
    

然后:

render()
  if (!this.state.loaded) 
      return this.renderLoadingView();
    

    return (
      <View style=
        flex: 1
      >
      <ListView
        dataSource=this.state.dataSource
        renderRow=this.renderRow
        style=styles.listView
      />
      </View>
    );
  

  renderRow(data) 

    var header = (
      <View>
          <View style=styles.rowContainer>
            <View  style=styles.textContainer>
              <Text style=styles.title>data.nid</Text>
              <Text style=styles.description numberOfLines=0>data.title</Text>
            </View>
          </View>
          <View style=styles.separator></View>
    </View>
    );
///////////
    var cid = [];
    var content = [];
    for(let x=0; x < Object.keys(data.course).length; x++)
      cid[x] = data.course[x].course_id;
      content.push(
        <TouchableHighlight
        underlayColor='#e3e0d7'
        key=x
        onPress= this._dosome  //// **** PROBLEM HERE ****
        style=styles.child
        >
        <Text style=styles.child>
        data.course[x].title
        </Text>
        </TouchableHighlight>
      );
    
    console.log(cid);
    var clist = (
      <View style=styles.rowContainer>
      content
      </View>
    );
////////////
    return (
      <Accordion
        header=header
        content=clist
        easing="easeOutCubic"
      />
    );
  


  renderLoadingView() 
    return (
      <View style=styles.loading>
        <Text style=styles.loading>
          Loading Courses, please wait...
        </Text>
      </View>
    );
  

但它没有工作,错误:

TypeError: Cannot read property '_dosome' of null(…)

我试着像这样在 onPress 上调用它:

onPress= this._dosome.bind(this) 

没有帮助

onPress= ()=> this._dosome.bind(this)

没有帮助

onPress= console.log(this.state.loaded)

即使我什至无法访问构造函数中定义的道具。它不知道“这个”是什么!

我试图以其他方式定义函数:

var _dosome = (dd) => 
      console.log(dd);
    ;

我尝试在渲染之前、渲染之后、渲染内部、渲染行内部和渲染行之后定义 _dosome。所有相同的结果。

我确实查看了很多教程、rnplay 上的很多示例应用程序、*** 中的很多线程、很多示例,但没有一个对我有用。 任何解决方案/想法? 非常感谢任何帮助。我现在在这个问题上苦苦挣扎了 2 天。 提前致谢!

【问题讨论】:

请告诉我们你的 react-native 版本 @DavidGuan,我没明白你的意思 您可以在package.json 中查看它,例如 "react-native": "0.29.0" 很抱歉,我误读了您的问题。它是 0.27.2 非常感谢。已经在您的帮助下解决了 【参考方案1】:

如何解决您的问题

改变

  <ListView
    dataSource=this.state.dataSource
    renderRow=this.renderRow
    style=styles.listView
  />

  <ListView
    dataSource=this.state.dataSource
    renderRow=data => this.renderRow(data)
    style=styles.listView
  />

或者

  <ListView
    dataSource=this.state.dataSource
    renderRow=this.renderRow.bind(this)
    style=styles.listView
  />

为什么?

如您所知(因为您试图通过使用箭头函数和bind 来解决问题),调用renderRow,调用者应该与组件本身处于相同的上下文中。 但是这个连接在renderRow=this.renderRow 中丢失了,它创建了一个新函数(新上下文)。

【讨论】:

以上是关于React-Native:无法访问状态值或从 renderRow 声明的任何方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 App.js (React-Native) 中访问 redux 状态

无法更新状态 - react-native

无法对未安装的组件执行 React 状态更新。 useEffect React-Native

react-native:无法使用发布模式访问Android权限

异步 API 调用,Redux React-Native

如何在 react-native 中访问相机我无法将图片保存在手机存储中