【问题标题】:How do I get a different result with the same state call in React Native?如何在 React Native 中使用相同的状态调用获得不同的结果?
【发布时间】:2019-03-08 12:28:28
【问题描述】:

对于问题的措辞令人困惑,我深表歉意。基本上当我从这里调用状态时:

    this.state = {
     newdiscoverPlanet: [
      'sunp',
      'twop',
      'bluep',
      'purplep',
      'bluepurplep',
      'redp',
      'orangep'

    ],
};

_getRandomPlanet(){
  var planetItem = this.state.newdiscoverPlanet[Math.floor(Math.random()*this.state.newdiscoverPlanet.length)];
  this.setState({
    currentPlanet: planetItem,
  });
}

如何从同一个状态得到不同的结果?

<Text>{this.state.currentPlanet}</Text>
<Text>{this.state.currentPlanet}</Text>
<Text>{this.state.currentPlanet}</Text>

我知道我可以使用 newdiscoverPlanet 的所有项目再添加两个不同的状态,但是 1) 我有机会获得相同的结果 2) 对于可能有更简单解决方案的东西来说,这似乎太长了。

【问题讨论】:

  • 你能发布你的完整状态对象吗?您当前的状态没有 currentPlanet `property.

标签: javascript reactjs react-native random jsx


【解决方案1】:

不要将随机生成的名称放在状态中,而是在您的render 函数中多次调用该函数以生成随机名称。

基本上这样的事情应该可以解决问题:

_getRandomPlanet(){
  var planetItem = this.state.newdiscoverPlanet[Math.floor(Math.random()*this.state.newdiscoverPlanet.length)];
  return planetItem
}

在你的 JSX 中:

<Text>{this._getRandomPlanet()}</Text>
<Text>{this._getRandomPlanet()}</Text>
<Text>{this._getRandomPlanet()}</Text>

【讨论】:

  • 谢谢,但我很难理解这一点:require("../img/" + this._getRandomPlanet() + ".png")。有没有办法像这样在require 中放置一个函数?
  • 我觉得你可以考虑导入所有的星球图片,然后根据随机生成的名字选择你想要的。
  • 我认为您应该将随机生成的名称放入状态中,否则您将无法控制行星集何时随机化,并且每次父级渲染时行星集都会发生变化。
  • 同意。如果保留随机生成的值很重要,那么您应该考虑 remix23 的解决方案
  • @LaneyWilliams 您不能在 react-native 中动态要求。
【解决方案2】:

首先,如果newdiscoverPlanet 是常量,则它不应该处于该状态(文件常量或静态成员、实例甚至道具成员都可以,但它并不是组件的真正状态)。

那么根据我对您的问题的理解,您似乎想要随机选择 newDiscoverPlanet 而不仅仅是一个。

从我从评论中读到的内容看来,您似乎还需要为每个行星导入图像文件。

那又怎样:

    import sunpImg from '../img/sunp.png';
    import twopImg from '../img/twop.png';
    import bluepImg from '../img/bluep.png';
    import purplepImg from '../img/purplep.png';
    import bluepurplepImg from '../img/bluepurplep.png';
    import redpImg from '../img/redp.png';
    import orangepImg from '../img/orangep.png';

    const planetsObj = [
        { name:'sunp', img: sunpImg },
        { name:'twop', img: twopImg },
        { name:'bluep', img: bluepImg },
        { name:'purplep', img: purplepImg },
        { name:'bluepurplep', img: bluepurplepImg },
        { name:'redp', img: redpImg },
        { name:'orangep', img: orangepImg },
    ];

    class YouComponent extends Component {

        state = {
            randomPlanets: this.getRandomPlanets()
        }
        getRandomPlanets() {
            // Note: since the randomization relies on random sorting
            // you won't have the same planet twice, if you want a 
            // subset (less planets) just use .slice(numOfItem)
            return [...planetsObj].sort(() => parseInt(Math.random() * 3, 10) - 1);
        }
        updateRandomPlanets() {
            this.setState(() => ({ randomPlanets: this.getRandomPlanets() }));
        }
        render() {
            const { randomPlanets } = this.state;
            // Note: if you randomize during render the renders
            // won't be consistent and the display won't be controllable
            return (
                {randomPlanets.map(planet => (
                    <div>
                        <img src={planet.img} />
                        <Text>{planet.name}</Text>
                    </div>
                ))}
            );
        }
    }

【讨论】:

  • 您不能在 react-native 中动态要求值。所以这个解决方案行不通
  • 谢谢@Andrew,今天我学到了。我还使用静态导入更新了答案。导入也可以是预先构建的,或者可能存在用于 react native 的动态导入解决方案,但这是另一回事......
猜你喜欢
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多