【问题标题】:React Native - Button onPress not workingReact Native - 按钮 onPress 不起作用
【发布时间】:2019-02-18 18:54:49
【问题描述】:

我不明白为什么当我按下按钮时我的功能不起作用。没有错误显示。我也试过 onPress={this.loginHandler} 并且有一条消息说

警告:失败的道具类型:道具 onPress 在 Button 中被标记为必需,但它的值未定义。

这是我的代码:

import React, {Component} from 'react';
import { Button} from 'react-native';


export default class AuthScreen extends Component {
  loginHandler = () => {
    console.log('P11');
  }

render() {
    return (
      <View>
          <Button style={styles.btnLogin} title='Iniciá sesión' onPress={this.loginHandler}  style={{flex:1}}/>
      </View>
    );
  }
}

【问题讨论】:

    标签: javascript reactjs react-native ecmascript-6


    【解决方案1】:

    试试这个。

    其实你得执行onPress函数。

    import React, {Component} from 'react';
    import { Button} from 'react-native';
    
    
    export default class AuthScreen extends Component {
    
      loginHandler = () => {
         console.log('P11');
      }
    
      render() {
        return (
          <View>
              <Button style={styles.btnLogin} title='Iniciá sesión' onPress={() => this.loginHandler()}  style={{flex:1}}/>
          </View>
        );
      }
    }
    

    【讨论】:

    • 这会导致错误:undefined is not a function (evalating '_this2.loginHandler()'
    • 我找到了查看更新的答案!把你的功能放在课堂上。 :)
    • 赞成,但在答案中解释了为什么它不起作用以及OP应该做什么会更好:)
    • 将函数放在类中完全有意义,但仍然不起作用。我不明白。
    • 它应该可以工作,您可以通过更新您的问题来分享您当前的代码。不要替换旧代码,请更新问题并添加当前问题。
    【解决方案2】:

    你可以使用:

    onPress={() => this.loginHandler()}
    

    或:

    onPress={this.loginHandler}
    

    但是,第二个更好,因为它不会在每次渲染中重新创建,因为我们使用的是引用,而不是调用回调。在这里,问题是你在你的类之外定义你的函数。所以this.loginHandler 没有指向你的函数。

    它将像这样工作:

    const loginHandler = () => {
      console.log("P11");
    };
    
    export default class AuthScreen extends Component {
      render() {
        return (
          <View>
            <Button
              style={styles.btnLogin}
              title="Iniciá sesión"
              onPress={loginHandler}
              style={{ flex: 1 }}
            />
          </View>
        );
      }
    }
    

    你在这里使用了一个外部函数,但你可能不想要这个,因为将来你会想在你的类中使用一些变量或其他方法。所以,把它移到你的班级并使用this

    export default class AuthScreen extends Component {
      loginHandler = () => {
        console.log("P11");
      };
    
      render() {
        return (
          <View>
            <Button
              style={styles.btnLogin}
              title="Iniciá sesión"
              onPress={this.loginHandler}
              style={{ flex: 1 }}
            />
          </View>
        );
      }
    }
    

    class App extends React.Component {
      loginHandler = () => {
        console.log("P11");
      };
    
      render() {
        return (
          <div>
            <button title="Iniciá sesión" onClick={this.loginHandler}>Click</button>
          </div>
        );
      }
    }
    
    ReactDOM.render(<App />, document.getElementById("root"));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
    <div id="root"></div>

    【讨论】:

    • 我把我的函数放在了类里面,但是还是不行
    • 你如何测试你的代码?我不知道 React Native,但onPress 应该可以在哪里测试这段代码,对吧?
    • 通过带有 npm run android 的 gennymotion 模拟器。是的,应该
    • 出了什么问题?我现在正在玩世博会,它正在发挥作用:)
    • 其实你的第一个答案是正确的。我正在做一些非常愚蠢的事情。将 console.log 进行测试,但我没有控制台。将其更改为警报()。谢谢你的一切。
    【解决方案3】:

    也许你想试试这个

    试着像这样改变你的功能

    import React, {Component} from 'react';
    import { Button} from 'react-native';
    
    
    export default class AuthScreen extends Component {
      loginHandler () {
        console.log('P11');
      }
    
    render() {
        return (
          <View>
              <Button style={styles.btnLogin} title='Iniciá sesión' onPress={this.loginHandler}  style={{flex:1}}/>
          </View>
        );
      }
    }
    

    【讨论】:

    • 有效!!其实你的第一个答案是正确的。我正在做一些非常愚蠢的事情。将 console.log 进行测试,但我没有控制台。谢谢你的一切。
    • 是的哈哈很高兴知道..如果对您有帮助,请投票给答案。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多