React Native JSX:设置状态会导致应用崩溃

时间:2017-05-26 03:07:32

标签: reactjs react-native state react-jsx

我正在使用react native来构建我的应用程序。以下是我用来显示“标签”列表的代码。因此,代码用于隐藏除前2个之外的所有标记,并且“加载更多”标记。链接将出现。单击加载更多链接应该显示其余标记。但是代码崩溃了。

this.state = {
  visibleCount: 2,
};

<TextLink onPress={() => {
    this.setState({visibleCount: mealTags.length});
  }}
</TextLink>

我正在使用更改状态来显示标签。任何人都可以告诉我出了什么问题以及如何更新它?

export function MealTagsSection(props: MealTagsProps) {
  let {mealTags} = props;
  let loadMoreLink;

  if (mealTags.length > 2) {
    loadMoreLink = (
      //THIS CAUSES THE APP TO CRASH
      <TextLink onPress={() => {
        this.setState({visibleCount: mealTags.length});
      }}
      >
        load more...
      </TextLink>
    );
  } else {
    loadMoreLink = null;
  }

  this.state = {
    visibleCount: 2,
  };

  return (
    <View style={styles.mealTagsContainer}>
      {
        mealTags.slice(0, this.state.visibleCount).map((mealTag) => {
          let tagStyle = '';
          if (mealTag.category === 1) {
            tagStyle = styles.tag_healthy;
          } else {
            tagStyle = styles.tag_improve;
          }
          return (
            <View style={tagStyle}>
              <Text style={styles.tagText}>{mealTag.description}</Text>
            </View>
          );
        })
      }
      {loadMoreLink}
    </View>
  );
}

我得到的错误是这样的: ***由于未捕获的异常而终止应用程序&#39; RCTFatalException:未处理的JS异常:t.setState不是函数。 (在&#39; t.setState({visibleCount:n.length})&#39;,&#39; t.setState&#39;未定义)&#39;,原因:&#39;未处理的JS异常:t.setState不是函数。 (在&#39; t.setState({visi ...,stack:onPress @ 439:2034

1 个答案:

答案 0 :(得分:2)

您的MealTagsSection是一个功能组件。反应功能组件不必包含本地状态。如果想拥有本地状态,那么你应该把它变成一个类组件。

export class MealTagsSection extends Component {
  constructor() {
    super();
    this.state = { visibleCount: 2 };
  }

  render() {
    let { mealTags } = this.props;
    let loadMoreLink;

    if (mealTags.length > 2) {
      loadMoreLink =
        (
          <TextLink
            onPress={() => {
              this.setState({ visibleCount: mealTags.length });
            }}
          >
            load more...
          </TextLink>
        );
    } else {
      loadMoreLink = null;
    }

    return (
      <View style={styles.mealTagsContainer}>
        {mealTags.slice(0, this.state.visibleCount).map(mealTag => {
          let tagStyle = "";
          if (mealTag.category === 1) {
            tagStyle = styles.tag_healthy;
          } else {
            tagStyle = styles.tag_improve;
          }
          return (
            <View style={tagStyle}>
              <Text style={styles.tagText}>{mealTag.description}</Text>
            </View>
          );
        })}
        {loadMoreLink}
      </View>
    );
  }
}