关于webapp架构和reactJs的建议
Advice about webapp architecture and reactJs
这个问题更多的是为了了解你对我试图解决这个问题的方式的看法。我需要一点ReactJs的专业知识,因为我是个新手。
首先是一点上下文。我正在使用ReactJs开发一个web应用程序作为前端部分。这个网络应用程序将有很多翻译,所以为了维护,我认为最好将所有翻译存储在数据库中,而不是将它们存储在文件中。通过这种方式,我可以使用sql脚本来管理它们。
我使用MySQL数据库作为后端,但出于性能原因,我添加了ElasticSearch作为第二个数据库(嗯,它更像是一个全文搜索引擎)。
因此,一旦应用程序启动,翻译就会自动加载到ElasticSearch中。每个翻译都有一个代码和一个文本,所以在弹性搜索中,我只加载一个语言环境(默认为英语)的翻译,当用户切换语言环境时,会调用以加载所选语言环境的所有翻译并更新其相应的文本。
通过这种方式,从前面开始,我只能通过代码引用翻译,并且我将在正确的语言环境中翻译文本。
现在,我该如何在反应中做到这一点?
到目前为止,我已经编写了一个组件TranslatedMessage,它基本上是在寻找给定的代码,并在呈现该组件时显示它。
组件代码下方:
import React from 'react';
export class TranslatedMessage extends React.Component {
constructor() {
super();
this.render = this.render.bind(this);
this.componentDidMount = this.componentDidMount.bind(this);
this.state = {message: ''};
}
render() {
return (<div>{this.state.message}</div>);
}
componentDidMount() {
var component = this;
var code=this.props.code;
var url="data/translation?code="+code;
$.get(url, function (result) {
component.setState({message: result.text});
});
}
};
然后我在应用程序whis中使用它,例如翻译"a"链接的标题:
<a href="index"><TranslatedMessage code="lng.dropdown.home"/><i className="fa fa-chevron-down" /></a>
到目前为止工作正常,但问题是我需要刷新整个页面以显示新的翻译,因为我没有更新组件的状态。
现在我的问题是:
1) 每当我们在页面中找到组件TranslatedMessage时,就会创建该组件的新实例,对吗?所以基本上,如果我有1000个翻译,就会创建该组件的1000个实例?然后React必须小心并观察所有这些实例的状态变化?这会不会对表现很不利?你找到更有效的方法了吗?
2) 我不认为强制整个页面重新加载是最合适的方法,但当用户切换区域设置时,我如何更新所有组件的状态?我一直在读一个名为Flux的框架(或模式),也许它可以满足我的需求,你觉得怎么样,你会推荐它吗?
3) 你认为把翻译存储在数据库上怎么样?我有点担心每次翻译都要向数据库发送一个查询,你推荐还是不推荐这种方法?
欢迎提出任何建议、改进意见!
感谢您花时间阅读或提供任何帮助!
我使用的基本上是Flux存储。在初始化时,应用程序请求使用整个语言文件(即JSON),并将其推入存储中的内存,类似于这样(我现在假设是一个完全扁平的语言文件,我使用的是ES2015/16语法,为了简洁起见,我省略了错误检查等):
class I18n {
constructor() {
this.lang = await fetch( 'lang_endpoint' )
.then( res => res.json() )
}
get( translation ) {
return this.lang[ translation ] || null
}
}
在某个地方,我的应用程序在ReactDOM.render( <App /> )
或某些变体期间启动,这会自上而下地呈现整个过程(我尽量消除状态)。如果我需要切换语言,那么我会绑定一个change
处理程序,以便商店发出一个change
事件,该事件由触发ReactDOM.render
的一些代码听到。这是Flux更改应用程序状态的标准做法,关键是尝试从组件中消除状态,并将其存储在商店中。
要使用I18n
类,只需在某个地方实例化它(我通常将它作为从文件导出的单例,例如module.exports = new I18n()
、require
,将该文件导出到组件中,并使用get
方法(这假设了某种打包程序,如browserfy或webpack,但看起来您已经对复杂性进行了排序):
import 'i18n' from 'stores/i18n'
class MyComponent extends React.Component {
constructor() { ... }
render() {
return (
<span>{ i18n.get( 'title' ) }</span>
)
}
}
该组件也可以简化为
const MyComponent = props => <span>{ i18n.get( 'title' ) }</span>
- 如何在ReactJS JSX中执行嵌套的if-else语句
- 拨打'父亲'函数形式a'儿童'ReactJS中的组件
- ReactJS映射:如何仅在url变量不为空时呈现html链接
- 如何更改reactjs中外部/独立组件的状态或属性
- ReactJS和SpringDataRest缓存问题可能与websocket有关
- reactjs this.refs vs document.getElementById
- 同构reactjs-cdn资产
- 在ReactJS中重新渲染孩子3次可以接受吗
- 如何在ReactJs中显示Json数据
- 将IndexedDB中的数据拉入数组,并通过ReactJS输出
- 如何在ReactJs中渲染子组件时重新加载子组件的数据
- 如何在ReactJs中链接下拉列表和文本区域
- 如何在ReactJs中呈现选定选项的更改表
- 在select上呈现不同形式的reactjs
- onClick事件未触发reactjs
- 如何在ReactJs中渲染重音符号
- reactjs无法将this.pops传递到react图表列表中
- 在reactjs组件中预加载数据
- JavaScript中的条件导入或替代(ReactJS WebApp)
- 关于webapp架构和reactJs的建议