无法访问函数内部的状态

Posted

技术标签:

【中文标题】无法访问函数内部的状态【英文标题】:Cannot access State inside Function 【发布时间】:2019-03-24 11:23:12 【问题描述】:

我在我的应用程序中使用React Native,有一次,我注意到我每次都必须在我的组件中输入this.state.bar[this.state.foo][SOME_NUMBER]

这工作得很好,但我想通过调用一个函数来使我的代码更简洁。所以,我构造了这个:

function txt(n)
    return this.state.bar[this.state.foo][n];

但是,当我在 Expo 客户端中运行它时,我收到以下错误:

TypeError: undefined is not an object (evaluating 'this.state.bar')

This error is located at:
    in App...
    ....

这是我的全部代码。

import React, 
     Component  
from 'react';
import  
     ... 
 from 'react-native';

export default class App extends React.Component 
    state = 
        foo: 'ABC',
        bar: 
            'ABC': [
                '...',
                '...',
                '...'
            ]
        
    ;
    render() 
        function txt(n)
            return this.state.bar[this.state.foo][n];
        
        return (
            <View>
                ...  
            </View>
        );
    

我尝试将text() 函数放在App 类之外,但得到了同样的错误。

当我将它放在App 中的render() 之外时,出现unexpected token 错误。

当我在constructor(props) 中定义this.state 并将text() 放在constructor 中时,我得到了ReferenceError: Can't find variable: text

【问题讨论】:

使用数组函数 @Thomas 我相信你的意思是arrow-function 【参考方案1】:

您的问题是范围界定。

您尝试在txt() 函数内部访问的this 指向它自己的this,而不是外部组件this

有几种方法可以解决此问题。这里有一些:

使用箭头函数

您可以将txt 转换为箭头函数以使用外部this

render() 
    const txt = (n) => 
        return this.state.bar[this.state.foo][n];
    
    return (
        <View>
            ...  
        </View>
    );

可以绑定函数使用外层this

render() 
    function _txt(n)
        return this.state.bar[this.state.foo][n];
    


    const txt = _txt.bind(this);

    return (
        <View>
            ...  
        </View>
    );

您可以创建一个指向外部this 的附加变量

render() 
    const self = this;
    function txt(n)
        return self.state.bar[self.state.foo][n];
    
    return (
        <View>
            ...  
        </View>
    );

其他方法

您可以将txt 函数移到渲染函数之外,并将其绑定到组件this。 您可以在组件类块中使用箭头函数,这看起来就像您已将其绑定到组件的this。 您可以将状态作为参数传递给函数

...而且我确信还有其他几种方法可以解决此问题。您只需要知道何时使用组件的this 或其他this

【讨论】:

非常感谢!像魅力一样工作!我使用了第二种方法并添加了const text = _text.bind(this) 并且有效!基本上,我知道我必须使用bind(),但我不明白在哪里以及如何使用! 这样绑定它的“问题”是(或者甚至在渲染函数中创建函数)是每次渲染组件时都创建一个新的函数元素。这是最好不要在渲染函数中为非常大的组件创建函数的原因之一。 我明白你的意思 - 幸好我的功能很小!谢谢!【参考方案2】:

这里有几个问题。首先,您需要将text 函数绑定到构造函数中的类。您还需要将text函数移出render方法,并将其添加为类方法(函数名称前没有function):

import React,
 Component 
  from 'react';
import 
...
 from 'react-native';

export default class App extends React.Component 

  constructor () 
    super();
    this.state = 
      foo: 'ABC',
      bar: 
        'ABC': [
          '...',
          '...',
          '...'
        ]
      
    ;
    this.text = this.text.bind(this);
  

  text (n) 
    return this.state.bar[this.state.foo][n];
  

  render() 
    return (
      <View>
        ...
      </View>
    );
  

【讨论】:

Can't Find variable: text @MrigankPawagi 通过使用 Chase 的答案,您需要在 render 函数内使用 this.text,因为该函数不能作为 render 函数内的关键字使用。您可以在渲染函数的顶部执行 const text = this.text 并从那时起在不使用 this 的情况下使用它。

以上是关于无法访问函数内部的状态的主要内容,如果未能解决你的问题,请参考以下文章

无法访问函数内部的全局变量

无法访问静态函数内部的私有变量

无法从 if 正文访问函数内部声明的变量

装饰器的内部函数无法访问装饰器变量

以编程方式加载时无法从类函数内部访问 jQuery UI

在 componentDidUpdate 中无法访问的状态