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

如何基于react native中的条件导出对象?

惠诚
2023-03-14

我想根据条件导出对象,例如,首先检查“AsyncStorage”中存储的某些语言,然后根据语言返回特定的对象

文件:lang.js

import AsyncStorage from '@react-native-community/async-storage';
let exportingLang = {};

AsyncStorage.getItem('@lang').then(language=> {
    if(language){
        if(language === "hindi") exportingLang = {
           name: 'a hindi name'
        };
        else if(language === "panjabi") exportingLang = {
           name: 'a panjabi name'
        };
        else exportingLang = {
           name: 'a english name'
        };;
    }
});

export const Lang = exportingLang;

post.js代码

import {Lang} from 'lang';

export default Post = props => {

    return (
        <Text>{Lang.name}</Text>
    );
}

但是上面的代码不起作用。


共有2个答案

沈冠宇
2023-03-14

为什么不将exportingLang的值存储在state中,然后在组件中使用它呢?

import AsyncStorage from '@react-native-community/async-storage';

export default Post = props => {

    const [name, setName] = useState()

    AsyncStorage.getItem('@lang').then(language=> {
        if(language){
            if(language === "hindi") {
               setName('a hindi name')
            } else if(language === "panjabi") {
               setName('a punjabi name')
            } else {
               setName('an english name')
            };
        }
    });


    return (
        <Text>{name}</Text>
    );
}
冷翼
2023-03-14

这里首先要注意的是,根据文档,getItem返回一个JavaScriptPromise。按照JavaScript的工作方式,我们无法从promise中获取值并导出它们,而不解析或拒绝promise,这里将详细介绍。为了用您的示例来解释它,您可以为exportingLang分配一个值,但它几乎肯定会返回初始化它的初始空对象{},因为Promise分配是异步进行的,也就是说,它需要等待存储系统找到@lang键,然后返回它的值,这可能需要一段时间(因此需要promise)。

如果使用lang.js文件的目的是避免反复输入If语句,那么这一切都没问题(否则我只需在我需要的组件中使用getItemPromise一次)。我将首先确保我们将promise返回的结果导出如下:

lang.js

export default AsyncStorage.getItem('@lang').then(language => {
  let exportingLang = {name: 'default'};
  if (language) {
    if (language === 'hindi')
      exportingLang = {
        name: 'a hindi name',
      };
    else if (language === 'panjabi')
      exportingLang = {
        name: 'a panjabi name',
      };
    else
      exportingLang = {
        name: 'a english name',
      };
  }
  return exportingLang;
});

这反过来会给我另一个出口promise。

其次,不能将Promise中的值直接用于React渲染方法。您需要使用useStateuse效应将其分配到一个状态。你可以在这里读到更多。

为了简单起见,我在一个Component中使用了它,如下所示:

import langPromise from './lang';

export default class App extends Component {
  state = {
    lang: { name: '' },
  };

  async componentDidMount() {
    const lang = await langPromise.then(lang => this.setState({ lang }));
  }

  render() {
    return (
      <View>
        <Text>{this.state.lang.name}</Text>
      </View>
    );
  }
}

如果您有任何进一步的问题,请让我知道。

 类似资料:
  • 问题内容: 我有一个带有JSONB列的表,其中包含类似 我想向匹配=和=的JSON对象添加一个新的JSON条目(),这将导致 以下查询返回符合过滤器要求 的JSON对象 : 我现在的问题是,我不知道如何将新条目添加到特定对象。我尝试了类似的东西 但这不会像未知列那样执行。在分配给之前,我还确实需要将的结果与其余的合并,因为否则会覆盖整个内容。 如何根据过滤条件更新特定的深层嵌套JSON对象?如果我

  • 我该如何做到这一点?谢了!

  • 此问题与几天前发布的问题类似,将行从0折叠到0 与前一个问题不同的是,我们如何根据Id折叠那些时间差小于或等于60的行。 例如,使用相同的数据集 这将通过ID计算时差 这将导致如下所示的新列差异 现在只按< code >事件折叠行。身份证明..其中时间差小于或等于60,即< code>diff 正在寻找有关如何创建这种折叠数据集的帮助。提前谢谢。

  • 我在互联网上到处搜索,寻找在特定页面上有条件地显示WooCommerce产品属性数据的方法。 如果属性某物有一个值,并且它在/上?过滤=1 如果属性位于特定的筛选页面上,我希望以不同的方式显示它们 前任:http://www.colorselectcoil.com/color-match-tool/?filtering=1 基于这个过滤的页面,显示一个产品属性“某物酷” 如果它是一个普通的Word

  • 我有一个map对象,它由key作为字符串和value作为字符串列表组成,我所需要做的就是用JSTL迭代这个列表 例如; 我如何在JSTl中对list对象进行ITEART,并检查上面的条件。请提供建议。

  • 我试图通过比较对象中的多个字段来从数组中找到重复的对象。 我想将对象的两个字段与同一数组的其他对象进行比较。 我想露营只是名称和 lname,忽略我的对象内的第 3 个字段 如何查找和删除输出如下的重复对象