当前位置: 首页 > 知识库问答 >
问题:

react native with AsyncStore中的条件呈现失败

漆雕欣德
2023-03-14

我使用React-Native与Redux,我想呈现一个按钮,如果登录用户是合格的。不知何故,按钮不显示!

用于存储数据,我使用的是react-nate-simu-store

renderIfEligible(toRender) {
  const building = this.props.building;
  const timings = this.props.timings;

  if (building && timings) {
    store.get(storage.userKey).then(user => {
      if (user != null) {
        if (building.submitter.includes(this.props.userId)) {
          console.log('RENDER');  // THIS IS PRINTED OUT IN THE BROWSER
          return toRender;
        }
      } else {
        console.log('NO RENDER');
        return false;
      }
    });
  }
}

// Function call
{this.renderIfEligible(
   <Button style={{marginTop: 20}} small danger transparent onPress={() => alert("delete")}><Icon name="trash" /></Button>)}

知道为什么console.log()工作时按钮不显示吗?

我补充说

constructor(props) {
  super(props);
  this.state = { showButton: false};
}
  ....
renderIfEligible(toRender){
  self = this;
  if (building.submitter.includes(this.props.userId)) {
    self.setState({ showButton: true});
  } else {
    self.setState({ showButton: false});
  }

共有2个答案

严宸
2023-03-14

按钮未显示,因为store.get(storage.userKey)正在返回用户对象promise,然后使用then函数将其映射到组件(或false)。

由于您没有返回then函数的结果,因此renderifficible的结果始终是未定义的(您的返回的用于lambda函数)。

不幸的是,只需将函数更改为return store.get(storage.userKey)=

看看这个答案,看看如何解决这个问题。

汲灿
2023-03-14

为了使此按钮基于react native simple store正确渲染,您需要初始化组件中用于初始渲染的store.get(storage.userKey)中的值,然后在componentDidMount中调用store.get()方法获取用户密钥,并将其设置为默认值。这里有一个小例子。

class MyComponent extends React.Component {

  constructor(props) {
    super(props);
    this.state = {
      isEligible: false,
    };
  }

  componentDidMount() {
    store.get(storage.userKey).then(user => {
      if (user !== null) { // add to this if statement any other checks you need
        this.setState({ isEligible: true });
      }
    });
  }

  render() {
    const { building, timings } = this.props;
    const { isEligible } = this.state;

    if (building && timings && isEligible) {
      return (
        <Button ... />
      );
    }
    return null;
  }

}

基本上,您只需要为组件提供一个默认状态,直到获得正确的数据。对于本例,默认状态为组件不返回任何内容。我认为,作为一般规则,React呈现需要是同步的,因此,如果需要异步获取数据以便正确呈现,则只需在异步查询的值解析后,通过呈现生命周期再次发送组件即可。

 类似资料:
  • 如何使用JSX进行条件渲染? 例如,我这里有div,如果props的值为null,我想呈现文本“不知道”,否则如果props不等于null,则呈现props。 例如: 我试过了,但没有成功。知道我做错了什么吗? 提前感谢!

  • 如何在样式组件中使用条件渲染来设置我的按钮类在React中使用样式组件? 在css中,我会这样做: 如果我尝试使用'

  • 对于在其生命周期的某个点隐藏的组件,呈现它的最佳方式是什么?1)渲染组件,但不显示它(显示:无)。2)只在需要时渲染组件。什么对性能更好?如果组件的道具和状态稍后更新,是否最好让组件存在,但隐藏在虚拟DOM中? 或者这个:

  • JSF的 @ViewScoped不可用,因为它与CDI冲突 提交表单时,JSF动态呈现组件的值变为空 有条件呈现的输入组件不更新值 未调用CommandButton/CommandLink/Ajax操作/Listener方法或未更新输入值 我能想到导致这种行为的几种情况: “rendered”似乎是基于backing bean中的值重新计算的,而不是UI中给出的新值(如果默认为1,则提交时再次为1

  • 我有以下代码; 我遇到的问题是条件渲染线; 就好像它只识别OR运算符之间的一个条件,即放在第一位的条件。有没有可能在React with条件呈现中OR()运算符不可用? 如果是的话,我该如何实现以下的目标呢?例如基于2或条件的呈现。

  • 我想动态呈现JSX,如下所示; 因此,我希望仅当“showSubTextAndIcon”为true时,才渲染该子文本和图标。现在,上述方法不起作用,我得到一个语法错误,说:; 相邻的JSX元素必须包装在一个封闭的标记中。你想要一个JSX片段吗 这工作,如果我添加一个包装列布局。然而,当show SubTextAndIcon是真的时,这会扰乱我的布局。 注意:列布局是从材料ui库派生的。