ios - 有没有办法在我没有收到此错误的情况下使用 React-Intl 正确格式化?
问题描述
我正在开发一个 React Native 应用程序,我需要post_date
从第三方 API 返回的内容不显示为:2019-05-10 11:26:39
,而是显示:x many days ago
。
我尝试安装 React-Intl,然后App.js
像这样实现它:
import React from "react";
import { StyleSheet, Text, View } from "react-native";
import {
createBottomTabNavigator,
createStackNavigator,
createAppContainer
} from "react-navigation";
import { Provider } from "react-redux";
import { IntlProvider } from "react-intl";
import store from "./store";
import AuthScreen from "./screens/AuthScreen";
import WelcomeScreen from "./screens/WelcomeScreen";
import MapScreen from "./screens/MapScreen";
import DeckScreen from "./screens/DeckScreen";
import SettingsScreen from "./screens/SettingsScreen";
import ReviewScreen from "./screens/ReviewScreen";
const MainNavigator = createAppContainer(
createBottomTabNavigator({
welcome: WelcomeScreen,
auth: AuthScreen,
main: {
screen: createBottomTabNavigator({
map: MapScreen,
deck: DeckScreen,
review: {
screen: createStackNavigator({
review: ReviewScreen,
settings: SettingsScreen
})
}
})
}
})
);
export default class App extends React.Component {
render() {
return (
<Provider store={store}>
<View style={styles.container}>
<IntlProvider locale="en">
<MainNavigator />
</IntlProvider>
</View>
</Provider>
);
}
}
就像我DeckScreen.js
这样:
import React, { Component } from "react";
import { View, Text, Platform } from "react-native";
import { MapView } from "expo";
import { connect } from "react-redux";
import { Card, Button } from "react-native-elements";
// import Moment from "react-moment";
import { FormattedRelative } from "react-intl";
import Swipe from "../components/Swipe";
import * as actions from "../actions";
class DeckScreen extends Component {
renderCard(job) {
return (
<Card title={job.title}>
<View style={{ height: 300 }}>
<MapView
scrollEnabled={false}
style={{ flex: 1 }}
cacheEnabled={Platform.OS === "android" ? true : false}
/>
</View>
<View style={styles.detailWrapper}>
<Text>{job.company.id}</Text>
<FormattedRelative value={job.post_date.toString()} />
</View>
<Text>
{job.description.replace(/<span>/g, "").replace(/<\/span>/g, "")}
</Text>
</Card>
);
}
我觉得使用 React-Intl 比使用 Momentjs 更接近于获得我想要的东西,但是我收到了这个错误:
console.error:“[React Intl] 格式化相对时间时出错。RangeError:提供给 IntlRelativeFormat#format() 的日期值不在有效范围内。”
我的代码格式不正确吗?任何人都有如何FormattedRelative
从 React-Intl 实施的经验?
我知道我可以toDateString()
用来摆脱时间戳部分2019-05-10 11:26:39
,但是当我尝试通过实现它时<FormattedRelative value={job.post_date.toDateString()} />
,我继续收到相同的错误消息。
解决方案
升级到 React-Intl 3.0 后,我很长一段时间都在为类似的问题苦苦挣扎。这是我在V3 升级指南的帮助下制作的包装器
import React from 'react';
import { FormattedRelativeTime } from 'react-intl';
import { selectUnit } from '@formatjs/intl-utils';
type Props = {
value: Date | string | number
};
export default function RelativeTimeWrapper(props: Props) {
const select = selectUnit(new Date(props.value));
return (
<FormattedRelativeTime {...props} {...select} />
);
}
推荐阅读
- javascript - 在 JavaScript 中通过给定数组动态创建子标签及其类
- angular - 在 XY 轴上显示给定值 - Plotly
- java - 如何配置两个hazelcast缓存(即IMap)一个用于分布式缓存,另一个用于单实例缓存
- javascript - OAuth2 - 如何在没有客户端密码的情况下进行授权?
- sql - 使用 Sql Query 以格式化方式获取用户数据
- javascript - 有没有更简洁的方法来获取我的网址中的最后一个数字?
- jquery - 如果我使用 Ajax 进行 http 请求,curl `-u` 可以转换成什么?
- forms - Typo3 没有为新的 FrontendForms 找到模板
- c - 在c中创建的数组不为空?
- android - Android从网页网址设置自定义字体