当前位置: 首页 > news >正文

金山区做网站吗优化营商环境个人心得

金山区做网站吗,优化营商环境个人心得,贵阳网站建设hsyunso,做建筑材料的网站知乎专栏:zhuanlan.zhihu.com/c_215040065,个人博客:blog.caichengnan.com/ 前言 国际化是一个很常见的需求,之前没有这方面的相关经验,所以决定练一下手。正好最近在写一个react骨架(新项目可直接移植的骨…

知乎专栏:zhuanlan.zhihu.com/c_215040065,个人博客:blog.caichengnan.com/

前言

国际化是一个很常见的需求,之前没有这方面的相关经验,所以决定练一下手。正好最近在写一个react骨架(新项目可直接移植的骨架),上网查了一下,常用的解决方案是yahoo的react-intl库,大致效果如下。

实现思路

  • 首先解决静态国际化,即根据浏览器的语言,自动加载对应的语言模板。这里只需判断navigator.language类型即可,然后通过react-intl提供了IntlProvider组件,加载组件属性的locale和messages,最后在需要用到国际化的组件里,引入FormattedMessage组件(react-intl内置),通过id映射到对应的国际化文件里的属性(例如下面的en_US.js的hello)。即可实现静态国际化。

  • 动态国际化,即用户可以通过按钮切换,实现语言的切换。最容易想到的方案就是,在语言模板放在redux的store里,提供一个切换语言的action,改变store里的国家和语言模板,再触发对应的FormattedMessage组件渲染。let's do it!

代码实现

  • 在src下新建locale文件存放国际化语言的文件,这里我们新建了en_US.js和zh_CN.js。

en_US.js

const en_US = {hello: 'Hello, world!',name: 'my name is {name}'
}    
export default en_US;
复制代码

zh_CN.js

const zh_CN = {hello: '你好,世界!',name: '我的名字是 {name}'
}
export default zh_CN; 
复制代码

一个是常规的变量hello,一个是带有变量{name}的字段name

  • react-intl的IntlProvider组件类似redux的Provider组件,需要在全局引入。所以我们封装一下Intl.jsx组件,将redux和IntlProvider相结合。

Intl.jsx

import React, { Component } from 'react';
import { addLocaleData, IntlProvider } from 'react-intl';
import { connect } from 'react-redux';
import zh_CN from './locale/lang/zh_CN';
import en_US from './locale/lang/en_US.js';
import zh from 'react-intl/locale-data/zh';
import en from 'react-intl/locale-data/en';addLocaleData([...zh,...en]);class Inter extends Component {render() {let { locale, localeMessage, children } = this.props;return (<IntlProvider key={locale} locale={locale} messages={localeMessage}>{children}</IntlProvider>)}
};function chooseLocale(val) {let _val = val || navigator.language.split('_')[0];switch (_val) {case 'en':return en_US;case 'zh':return zh_CN;default:return en_US;}
}const mapStateToProps = (state, ownProps) => ({locale: state.root.language,localeMessage: chooseLocale(state.root.language)
});let Intl = connect(mapStateToProps)(Inter);export default Intl;
复制代码

解释一下这个组件,组件是将redux里的数据绑定到IntlProvider组件上,addLocaleData函数添加需要本地化的语言,这个需要声明。redux中传递两个props,locale代表当前语言,localeMessage代表locale里的语言文件内容。

这里有一个很关键的地方,即key属性。IntlProvider中的属性变更并不会触发FormattedMessage重新渲染,刚开始想要forceUpdate强制更新组件,后来上网查了一个解决方案,在组件中加入key,就能解决这个问题

  • 在实际使用语言的组件中引入FormattedMessage,当然react-intl还支持其他类型的转换组件,比如时间类型FormattedDate等等。可从官网上查询API。github

App.js

import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';
import { FormattedMessage } from 'react-intl';
import actions from '../actions/index.js';
import { connect } from 'react-redux';class App extends Component {changeLanguage() {let lang = this.props.locale;lang = lang === 'zh' ? 'en' : 'zh';this.props.changeLanguage(lang);}render() {const { locale } = this.props;return (<div className="App"><header className="App-header"><img src={logo} className="App-logo" alt="logo" /><h1 className="App-title"><FormattedMessageid="hello"/></h1></header><p className="App-intro"><FormattedMessageid="name"values={{ name: <b>{'carroll'}</b> }}/></p><button onClick={() => this.changeLanguage()}>{locale === 'zh' ? '切换英文' : 'change chinese'}</button></div>);}
}
const mapStateToProps = (state, ownProps) => ({locale: state.root.language,
});
const mapDispatchToProps = (dispatch, ownProps) => ({changeLanguage: (val) => dispatch(actions.changeLanguage(val))
});
export default connect(mapStateToProps,mapDispatchToProps
)(App);
复制代码

App.js主要实现了两个功能,一个实现动态切换的action,一个FormattedMessageid与数据的绑定。

  • 最后在根文件引入Intl.jsx即可
// ... 省略前面的引入
ReactDOM.render(<Provider store={store}><Intl><App /></Intl></Provider>,document.getElementById('root'));
复制代码
  • 下面是github上的源码

github源码

总结

整体实现下来,动态的国际化切换也没有多难,但是我们要有思考。把国际化的数据放在redux中是否有些浪费,可否不引入FormattedMessage也能解决文字的切换,在IntlProvider上绑定key是否会造成其他无关组件的重新渲染。这些都是我们需要考虑的问题。

如果错误请指出,如果对您有帮助,麻烦点个赞

转载于:https://juejin.im/post/5b497add5188251af3633c65

http://www.lbrq.cn/news/2565955.html

相关文章:

  • 小猫mip网站建设如何做公司网站推广
  • 小程序做网站百度公司官方网站
  • 福州做网站的个体户电话查询知了seo
  • 工业产品设计流程图百度竞价优化
  • 互联网网站模块广州优化疫情防控举措
  • 利用php做网站教程公司网站建设步骤
  • 网站制作公司武汉网络营销策划案范本
  • 三好街做网站的公司信息流优化师面试常见问题
  • 商业网站备案流程近三年成功的营销案例
  • 做问答的网站线上营销
  • 新疆网站建设介绍谷歌搜索引擎免费入口2022
  • 淘宝哪些做网站关键词排名的有用吗谷歌浏览器怎么下载
  • seo站长工具查询武汉网站排名提升
  • 做二手设备的网站成人再就业培训班
  • 招聘网站做销售营销网站建设都是专业技术人员
  • 武汉专业网站制作设计怎么注册个人网站
  • 做网站需要营业执照嘛外贸网站推广怎么做
  • 门户网站建设厂商名录谷歌代运营
  • 做视频网站容易收录吗郑州网站建设方案
  • 织梦 公司网站模板代做网页设计平台
  • 网站做信息流全网网络营销
  • 人大门户网站建设方案推广产品的软文怎么写
  • 绍兴网站建设模板网站百度浏览器官方下载
  • 专门做海外服装购的网站有哪些网站策划书案例
  • 大淘客网站建设nba赛季排名
  • 好便宜建站网络推广渠道公司
  • 个人网站设计内容和要求百度云
  • 邢台12345网站域名访问网站怎么进入
  • 西安企业网站日本产品和韩国产品哪个好
  • 厦门建设局网站技司学校百度推广官网入口
  • 【数据结构初阶】--排序(二)--直接选择排序,堆排序
  • linux编译基础知识-头文件标准路径
  • Python编程基础与实践:Python基础数据类型入门
  • 数论:卢卡斯定理
  • 3. boost::asio之同步读写的客户端和服务器示例
  • 【暑期每日一题】洛谷 P9390 金盏花