React中的从右到左(RTL)支持

20
什么是在React应用程序中实现RTL支持的最佳方法?是否有一种方法可以覆盖默认的

标签(组件)以添加RTL支持,以便我不必重写已编写的组件以具有RTL支持?(例如,具有一些全局变量window.RTL,因此当设置为true时,将所有

标签翻转文本方向为RTL)。我可能可以更改构建系统或制作一个babel插件,该插件将替换所有React.createElement(“p”...)与我的自己的p标记实现,但这是否有更好的解决方案?

谢谢。
7个回答

13

更优的方法是使用CSS/HTML的能力:

  • direction CSS属性
  • Unicode符号‏/‎
  • body上附加.rtl/.ltr类,并使用它们来更改顺序

在这种情况下,HTML元素的顺序对于RTL和LTR来说是相同的。不同之处在于应用的CSS规则。

如果您真的需要React中的元素顺序,则可以创建自己的组件,并在RTL时反转子列表:

const Dir = React.createClass({
  render: function() {
    let children = (this.props.direction == 'rtl' && this.props.children && this.props.children.reverse) ? this.props.children.reverse() : null;
    return <div>
      { children }
    </div>;
  }
});

// And use as:
// directionVariable = 'rtl'|'ltr'
<Dir direction={ directionVariable }>
  <a>First</a>
  <a>Second</a>
  <a>Third</a>
</Dir>

我正在寻找一种解决方案,可以修复现有组件的RTL支持,而无需我重写它们。因此,我考虑扩展/修补ReactDOM以启用此功能。例如,创建ReactDOMWithRTLSupport,它可以是ReactDOM的替代品。 - Pavle Lekic
为什么CSS规则不够? - Dmitry Yaremenko
我不确定是否只用 CSS 就能解决这个问题。如果可以,那太好了!但我认为可能需要更多的工作。通过替换这些基础组件,我将拥有更多的控制权。有人做过这个吗? - Pavle Lekic
那你没有RTL的经验吗? - Dmitry Yaremenko
是的,但这里有一个问题:有一个叫做cssjanus的库,可以将css从LTR转换为RTL。但是,如果我使用js中的CSS(请参见https://vimeo.com/116209150),我必须拦截传递给所有React组件的所有样式属性,以便我可以通过cssjanus运行它们。 - Pavle Lekic
显示剩余6条评论

7

简单易操作,只需要在index.js中为<html>设置dir属性即可,示例如下:

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';

ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  document.getElementById('root')
);

//HERE ->
document.getElementsByTagName('html')[0].setAttribute("dir", "rtl");
//Or you can do it where ever you want, base on user selected language, or something else 
serviceWorker.unregister();

更新:如果您的应用程序完全是RTL,请在<html>标签中添加dir="rtl",但如果用户可以选择可能是RTL或LTR的不同语言,则可以像上面的示例一样操作,并使用CSS处理其他内容...

只需检查用户选择的语言是否为RTL,然后执行document.getElementsByTagName('html')[0].setAttribute("dir", "rtl");即可让CSS处理外观部分。


4

以下是你的解决方案:

  1. first of all create an array of rtl language locales, like this:

     const rtlLanguages = ["ar"]
    
  2. here's how you can update your page direction based on your current language:

    function setPageDirection(language) {
      const dir = rtlLanguages.includes(language) ? "rtl" : "ltr"
      document.documentElement.dir = dir
    }
    
  3. now when you set your new language, update the page direction using the function above, like this:

     setPageDirection("en") // ltr
     setPageDirection("ar") // rtl
    

注意:为了在首次渲染时自动更新页面方向,请尝试在每次更新语言时将当前语言区域设置(例如:“en”)存储在localStorage中,然后尝试使用 useEffect(或 componentDidMount),并使用 localStorage.getItem获取您的语言,只需调用 setPageDirection 函数并提供语言即可。


一个快速的提示,如果你想在从右到左的方向修改你的HTML元素,请这样做:html[dir="rtl"] .your-class-name {} 反之亦然。 - Pr0grammer X

1

根据您的项目,转到 main.tsxmain.js 并将 <App /> 标签用 <div dir="rtl"></div> 包装,如下所示

 ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
  <React.StrictMode>
   <div dir="rtl">
     <App />
   </div>
  </React.StrictMode>
)

1
如果您使用 react-i18next
import React from 'react';
import { useTranslation } from 'react-i18next';
import './App.css';

function App()  {
    const { t, i18n } = useTranslation();
    document.body.dir = i18n.dir();
    return (
      <div className="App">
        {t('welcome')}
      </div>
    );
}

export default App;

1

0
我正在使用react-i18next,当选择阿拉伯语时将位置从左侧更改为右侧。 我已经完成了以下操作,并且对我有效。
首先,我进入index.html并在body标签内编写了以下内容:
<body dir="ltr">

当选择方向时,这将允许页面向左书写。 最后,我将此行添加到我的主代码App.js中:

document.body.dir = i18n.dir(); //this will change the direction of the dir in the index.html.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接