【问题标题】:accessing the state outside the class - Reactnative - this.setState is not a function访问类外的状态 - Reactnative - this.setState 不是函数
【发布时间】:2019-03-21 04:16:59
【问题描述】:

我正在使用类外部的自定义浮动文本标签,我想在其中设置状态。请问我该怎么做呢

当我单击按钮时,我有两个浮动文本字段,我想将状态设置为输入文本字段中输入的值。

错误是get is

this.setState 不是函数


const TextfieldWithFloatingLabel_Card = MKTextField.textfieldWithFloatingLabel()
  .withPlaceholder(strings.nineDigitCardNumber)
  .withStyle(styles.textfieldWithFloatingLabel)
  .withTextInputStyle({ flex: 1 })
  .withFloatingLabelFont({
    fontSize: 12,
    fontWeight: '200',
    color: colors.primaryColor
  })
  .withKeyboardType('numeric')
  .withOnEndEditing(e => {
    this.setState({ cardDigits: e.nativeEvent.text });
    console.log('EndEditing', e.nativeEvent.text);
  })
  .build();

const TextfieldWithFloatingLabel_NationalId = MKTextField.textfieldWithFloatingLabel()
  .withPlaceholder(strings.nationalIdNumber)
  .withStyle(styles.textfieldWithFloatingLabel)
  .withTextInputStyle({ flex: 1 })
  .withFloatingLabelFont({
    fontSize: 12,
    fontWeight: '200',
    color: colors.primaryColor
  })
  .withKeyboardType('numeric')
  .withOnEndEditing(e => {
    this.setState({ nationalIdNumber: e.nativeEvent.text });
    console.log('EndEditing', e.nativeEvent.text);
  })
  .build();

class Login extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      cardDigits: '',
      IdNumber: ''
    };
  }

  render() {
    //console.log('rovers - ' + JSON.stringify(this.state.rovers))
    return (
      <ScrollView style={styles.mainContainer}>
        <TextfieldWithFloatingLabel_Card ref="tiNumber" />
        <TextfieldWithFloatingLabel_NationalId ref="tiNationalId" />
        <TouchableOpacity
          title="Transactions"
          style={{
            height: 60,
            backgroundColor: '#673fb4',
            marginTop: 20,
            alignItems: 'center',
            justifyContent: 'center'
          }}
          onPress={() => {
            consoleLog(
              'cardnum : ' +
                this.state.cardDigits +
                ' national id - ' +
                this.state.IdNumber
            );
          }}
        >
          <CommonText style={{ color: 'white' }}>
            {strings.signInLower}
          </CommonText>
        </TouchableOpacity>
      </ScrollView>
    );
  }
}

谢谢 回复

【问题讨论】:

  • 你阅读过Handling Events 上的反应文档吗?这是 React 的核心概念。您需要将处理程序传递给绑定到持有状态的组件的无状态组件。提示:您的标签组件公开了一个 onEndEditing 属性,您需要在渲染时传递一个处理程序,而不是在构建器中静态定义它们。

标签: reactjs react-native setstate react-state-management


【解决方案1】:

改变

TextfieldWithFloatingLabel_Card

到一个函数而不是一个变量,无论你在组件中调用 TextfieldWithFloatingLabel_Card 的任何位置,都将它作为参数传递给它,这样当你执行 setState 时它就会起作用

我会告诉你怎么做

Test.js

 const test = this = {
      this.setState({test: “working”});
 }
 export = test();

App.js 组件

 import { test } from “./Test”;

 callTest = () => {
     test(this);
 }
 render(){
     return(
          <div onClick={this.callTest}>

          </div>
     )
 }

所以这里的重点是您需要将组件 this 传递给导入的常规函数​​,以便您可以设置组件的状态。

您所做的是旧方法。我建议您使用 in 组件处理事件处理程序函数。

如果有任何拼写错误,请执行我,因为我是在手机上回答的

【讨论】:

  • 这行得通,但你为什么偏爱这个而不是仅仅在组件本身中实现处理程序?
  • 如果我,我会在组件本身中做,因为 OP 只想在从其他模块导出的函数中执行 setState,我建议如何通过将其传递给函数来做到这一点
  • 我认为 OP 不想在导出的函数中执行此操作。他/她只是不知道如何使用组件构建器来完成它。也许他不知道您也可以将处理程序作为道具传递,并且不需要静态定义它们。它只是没有多大意义,因为处理程序强烈依赖于该特定组件中状态的形状。
  • 我同意你的看法。
猜你喜欢
  • 2017-05-04
  • 2016-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-03
相关资源
最近更新 更多