当我更改为 RTL 时,material-ui 图标不会翻转

2024-03-27

我用过瑞安·科格斯韦尔的回答 https://stackoverflow.com/questions/62799638/material-ui-textfield-not-affected-with-the-rtl-direction让我的项目与 RTL 兼容。

但由于某种原因,Material-ui 图标<Send/>没有相应地翻转。是不是因为不兼容RTL?或者我错过了什么?

以下示例显示“发送”图标不翻转:

import React from "react";
import { create } from "jss";
import rtl from "jss-rtl";
import {
  StylesProvider,
  jssPreset,
  ThemeProvider,
  createMuiTheme
} from "@material-ui/core/styles";
import CssBaseline from "@material-ui/core/CssBaseline";
import TextField from "@material-ui/core/TextField";
import Button from "@material-ui/core/Button";
import Box from "@material-ui/core/Box";
import SendIcon from "@material-ui/icons/Send";

// Configure JSS
const jss = create({ plugins: [...jssPreset().plugins, rtl()] });

const ltrTheme = createMuiTheme({ direction: "ltr" });
const rtlTheme = createMuiTheme({ direction: "rtl" });

function AppContent() {
  const [isRtl, setIsRtl] = React.useState(false);
  React.useLayoutEffect(() => {
    document.body.setAttribute("dir", isRtl ? "rtl" : "ltr");
  }, [isRtl]);
  return (
    <ThemeProvider theme={isRtl ? rtlTheme : ltrTheme}>
      <CssBaseline />
      <Box m={2}>
        <TextField label={isRtl ? "بريد الكتروني او هاتف" : "Email or Phone"} />
        <br />
        <SendIcon />
        <br />
        Current Direction: {isRtl ? "rtl" : "ltr"}
        <br />
        <Button onClick={() => setIsRtl(!isRtl)}>Toggle direction</Button>
      </Box>
    </ThemeProvider>
  );
}
export default function App() {
  return (
    <StylesProvider jss={jss}>
      <AppContent />
    </StylesProvider>
  );
}

Thanks


Material-UI 图标不会自动翻转为 RTL。这里讨论了一些:https://github.com/mui-org/material-ui/issues/22726 https://github.com/mui-org/material-ui/issues/22726.

这是处理此问题的一种方法的示例Send图标(这种方法也应该适用于其他图标):

const DirectionAwareSendIcon = withStyles((theme) => ({
  root: {
    transform: theme.direction === "rtl" ? "scaleX(-1)" : undefined
  }
}))(SendIcon);

也可以使用全局处理这个覆盖主题中的 https://material-ui.com/customization/components/#global-theme-override:

  MuiSvgIcon: {
    root: {
      "body[dir=rtl] &": {
        transform: "scaleX(-1)"
      }
    }
  }

存在一些风险,这可能会与某些使用 Material-UI 组件的样式发生冲突transform在默认样式中,但我到目前为止看过的示例(例如手风琴摘要 https://github.com/mui-org/material-ui/blob/v4.11.0/packages/material-ui/src/AccordionSummary/AccordionSummary.js#L62),似乎仍然工作正常。这种全球性的做法would目前导致问题表分页操作 https://github.com/mui-org/material-ui/blob/v4.11.0/packages/material-ui/src/TablePagination/TablePaginationActions.js#L40 and 分页项 https://github.com/mui-org/material-ui/blob/v4.11.0/packages/material-ui-lab/src/PaginationItem/PaginationItem.js#L213两者都交换它们使用的图标theme.direction。然后,这种全局方法将翻转已经翻转的图标,因此如果您使用这些组件中的任何一个,则需要考虑到这一点。

还有一些图标不需要翻转,例如带有可识别符号的图标,例如帮助(“?”)和 AttachMoney(“$”),因此我的建议是第一种方法,即显式添加翻转行为需要它的图标。

这是主题方法的完整工作示例:

import React from "react";
import { create } from "jss";
import rtl from "jss-rtl";
import {
  StylesProvider,
  jssPreset,
  ThemeProvider,
  createMuiTheme
} from "@material-ui/core/styles";
import CssBaseline from "@material-ui/core/CssBaseline";
import TextField from "@material-ui/core/TextField";
import Button from "@material-ui/core/Button";
import Box from "@material-ui/core/Box";
import SendIcon from "@material-ui/icons/Send";

const overrides = {
  MuiSvgIcon: {
    root: {
      "body[dir=rtl] &": {
        transform: "scaleX(-1)"
      }
    }
  }
};
// Configure JSS
const jss = create({ plugins: [...jssPreset().plugins, rtl()] });

const ltrTheme = createMuiTheme({ direction: "ltr" });
const rtlTheme = createMuiTheme({ direction: "rtl", overrides });

function AppContent() {
  const [isRtl, setIsRtl] = React.useState(false);
  React.useLayoutEffect(() => {
    document.body.setAttribute("dir", isRtl ? "rtl" : "ltr");
  }, [isRtl]);
  return (
    <ThemeProvider theme={isRtl ? rtlTheme : ltrTheme}>
      <CssBaseline />
      <Box m={2}>
        <TextField label={isRtl ? "بريد الكتروني او هاتف" : "Email or Phone"} />
        <br />
        <SendIcon />
        <br />
        Current Direction: {isRtl ? "rtl" : "ltr"}
        <br />
        <Button onClick={() => setIsRtl(!isRtl)}>Toggle direction</Button>
      </Box>
    </ThemeProvider>
  );
}
export default function App() {
  return (
    <StylesProvider jss={jss}>
      <AppContent />
    </StylesProvider>
  );
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当我更改为 RTL 时,material-ui 图标不会翻转 的相关文章

  • 从React Redux中的package.json获取版本号(create-react-app)

    OP 编辑 如果其他人遇到此问题 该应用程序是使用创建的创建反应应用程序 https github com facebookincubator create react app 这限制导入到 src 文件夹内 但是如果你将react scr
  • DevSettings.reload() 用于 React Native 中的注销

    问题 我正在将混合应用程序的注销功能从本机迁移到反应本机 要求 它可以在生产环境和设备上运行 它导航到应用程序的根屏幕 登录屏幕 它清除 redux 存储 很高兴有 它会取消任何飞行中的请求 最初 我们计划做这样的事情 如何重置 redux
  • 有没有办法从函数内单击导航链接?

    基本上 我正在延迟导航 单击链接后 onClick 处理程序通过检查条件并调用另一个函数来阻止导航 如果满足特定条件 则仅该页面导航到另一个页面 那么我如何从该函数中触发 Navlink 单击 我能够通过使用解决这个问题event prev
  • 如何使用正则表达式进行正确的输入验证?

    我想让用户只输入整数或浮点数 现在我只能输入整数 它允许输入点或逗号 无法找到正确的正则表达式来验证整数和浮点数
  • “找不到模块:错误:无法解析模块‘react/lib/ReactMount’”

    我使用Reactjs和webpack启动一个项目 当我在命令提示符中运行 node server 时 出现如下错误 并且chrome浏览器打开成功但也出现问题如下 github是 github com Yangqin0607 gallery
  • Antd 选择搜索框未呈现匹配项

    我有产品数据 我正在使用搜索值过滤数据 然后使用过滤后的数据呈现选项 产品数据作为道具来自全局 redux 存储 由于某种原因 下拉列表仅在搜索值为空时显示数据 当我开始输入时 filteredData已更新 组件也重新渲染 但选项不显示任
  • React Native 运行保持在 IDLE 状态

    这是我第一次设置 React NativeUbuntu 18 04 LTS 我已经完成设置 并且尝试使用以下命令在设备上运行该应用程序react native run android命令 这是我在终端中得到的输出 ron lenovo re
  • ESLint 如何集成到 Create React App 中?

    当我跑步时npx create react app some name 为我创建了一个简单的 React 项目 当我随后窥视package json 似乎有一些 ESLint 存在的证据 因为有 eslintConfig extends r
  • Next JS - 源代码中缺少元标签

    我安装了多个元标记 例如标题 描述 关键字等 但是 它没有在查看源代码中显示这些标签 因此 Facebook 共享卡无法正常工作 我已经安装了og标签 但在 Facebook 上似乎找不到它们Scraper或我的查看来源 然而 它填充在客户
  • 无法读取未定义错误的属性“匹配”

    我试图在 React JS 前端显示一些文本来代替个人资料图像 当它不可用时 基本上 我将当前客户名称传递给一个函数 该函数提取名称中所有单词的第一个字符 我能够仅显示名称 但是当我执行函数调用时 出现 无法读取未定义的属性 匹配 错误 并
  • 禁用 create-react-app 提供的 ESLint

    create react appv3 0 0 已发布 https github com facebook create react app blob master CHANGELOG md 它内部支持 TypeScript linting
  • 使用 React Hook Form 和 Yup 进行文件输入验证

    我尝试使用 React Hook Form 进行文件输入验证 是的 我写了下面的代码 但是当我测试文件的大小时 它在这里显示console log value 0 size 即使我在文件输入中选择了一个文件 该值也是未定义的 这有什么问题吗
  • ReactJS setState 仅在嵌套在 setState 中时才有效

    问题 当我使用 this setState 并在回调中输出状态时 它根本不会改变 但是当我将 setstate 嵌套在 setstate 中时 它将正常工作 例子 这不行 this setState data newData 这确实有效 t
  • 如何使用 Next Script 精确控制脚本标签的插入位置

    我目前正在尝试将第三方脚本添加到我的 Next js 应用程序中 该脚本会在脚本标签正下方插入一个 iframe 所以我需要精确控制脚本标签在页面上的位置 我目前正在使用下一个 脚本 https nextjs org docs api re
  • 如何将值从孩子的孩子传递给父母?

    我有一个父组件 有一个子组件 它也有一个子组件 Parent Child One child of parent Child Two child of child 当在子二中定义一个值时 我使用回调将该值传递给子一 但我也想将相同的值传递回
  • 无法验证 CSRF 令牌的真实性 Rails/React

    我的 Rails 应用程序中有一个 React 组件 我正在尝试使用它fetch 发送一个POST对于我在本地主机上托管的 Rails 应用程序 这给了我错误 ActionController InvalidAuthenticityToke
  • 如何使用 React 制作垂直选项卡

    有人可以为我提供一种使用 React 创建垂直选项卡的方法吗 我尝试了各种npm包 如react web tabs reactstrap和react bootstrap 最后两个只有水平选项卡的示例 React web tabs在其文档中有
  • 使用 React-navigation 的 React Native 中的模态窗口

    我在用react navigation在 React Native 中 我想在启动时确定用户是否已登录 如果他 她已经登录 我想打开一个模式窗口 全屏 如何最好地做到这一点 我在反应导航文档中找不到有条件显示屏幕的任何内容 看 你需要改变m
  • 如何使用 Firestore 中的对象数组更新 Field 中的特定对象? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 所以我有一个emojiCounter字段用于存储对象数组 例如 emojiCounter emoji
  • React Router 总是将我重定向到不同的 url

    我是 React 和 React Router 的新手 我正在使用 React Router v4 并遵循基于以前版本的教程 但我让它工作了 使用在 SO 上找到的一些东西和 React Router v4 文档上的一些东西 但有一件事困扰

随机推荐

  • 停止执行另一代码的代码

    我有一个R进行一些数据分析并返回的代码TRUE FALSE 有时 输入数据太大 代码就继续运行 我想要一个脚本来监视我的数据分析代码 如果它没有返回任何内容 比如说600 seconds 然后它会停止正在运行的代码并执行其他操作 就会像按S
  • C++ if 语句中的多个条件

    我对 C 编程的概念非常陌生 我想要使 用多条件 if 语句 或 和 和 在一份声明中 当我向我的大学教授询问此事时 她告诉我这是可能的 然后侮辱了我在这个问题上有限的知识 我有权访问的所有示例都显示了多个 语句 并且只有一个显示了 它没有
  • HTML - 如何在提交按钮上弹出确认窗口,然后发送请求?

    我正在学习网络开发Django并且在哪里放置负责是否提交请求的代码方面存在一些问题HTML code 例如 有一个网页包含form 博客 由用户填写 点击保存按钮后 会弹出一个窗口询问是否要confirm或不 如果点击confirm 然后发
  • 我如何用 es6(不带打字稿)开玩笑地模拟 Prisma 客户端?

    Prisma 文档提供了模拟客户端以及使用 jest 和 typescript 进行单元测试的示例 有没有办法在不使用 TypeScript 的情况下开玩笑地嘲笑客户端 如果您能举一个简单的例子 我将不胜感激 需要补充的小事情 我在项目中使
  • Python Selenium 通过链接循环

    我对 python 或编码很陌生 这部分代码允许我找到我想要单击的所有元素 单击链接打开一个新选项卡 from selenium import webdriver import time driver webdriver Chrome dr
  • 无法在 Postgres 中使用交叉表

    OSX 10 9 2 上的 Postgres 9 2 1 如果我运行以下交叉表示例查询 CREATE EXTENSION tablefunc CREATE TABLE ct id SERIAL rowid TEXT attribute TE
  • MVVM:如何将参数传递给 ViewModel 的构造函数

    我正在使用 L Bugnion 的 MVVM Light 框架 将参数 例如 Customers IS 传递给 ViewModel 构造函数的推荐方法有哪些 编辑 每个 ViewModel 所需的参数不是跨模型共享的参数 它对于每个视图模型
  • 如何在 MVC 6 beta7 中插入自定义视图引擎?

    在 beta6 中 我们能够像这样插入自定义视图引擎 services AddMvc AddViewOptions options gt options ViewEngines Clear options ViewEngines Add t
  • 如何查看交易是通过模拟账户购买还是通过真实账户购买?

    我正在使用测试帐户进行应用内购买测试 但谷歌的响应与从真实帐户进行的购买相同 如何根据谷歌的响应检查购买是否是测试 是的 您可以从Google的Purchases subscriptions API响应的purchaseType字段中检查这
  • 列表操作复杂度

    我一直认为List
  • 在 PHP 中重新格式化日期

    我有一个像这样的日期 时间字符串 180510 112440 格式为 ddmmyy hhmmss 我需要一个片段来格式化字符串 2010 05 18 11 24 40 感谢帮助 另一个可能的答案是常见的用法strptime http php
  • 构造函数中参数较少的构造函数

    我有构造函数树 int a int b int c 和第二个构造函数树 int a int b int c String s 如何从第一个构造函数加载第二个构造函数以节省编写所有逻辑 我想过这样的事情 但它给了我 空 对象 public T
  • Python Tkinter 刷新画布

    你好 我在 python 中有一个元组 其颜色与通过以下字典在画布中绘制的正方形相关 colour mapping 0 red 1 green 2 blue 3 purple 更具体地说 例如元组中的节点是 2 3 3 3 这意味着 4 个
  • 扩展方法在 C# 中有任何限制

    我想问一下 向数据类型添加扩展方法是否与微软的方法一样 或者有什么限制吗 这与经验丰富的程序员有关 他们在使用它们时发现了一些限制 您正在考虑什么样的限制 我不是特别喜欢它们被发现的方式 特别是 如果扩展类型稍后获得具有相同签名的方法 则将
  • 使用 UIWebView 上传照片

    假设我在远程服务器上有一个网页 例如 filebrowse html 有一个浏览文件按钮 我想通过UIWebView并从我的画廊上传照片 画廊位于 iPhone 上 这可能吗 在 iOS 上 无法 浏览文件系统 因此您无法使用 UIWebV
  • 将 UIButton 字体大小调整为宽度

    我有以下代码 UIButton button UIButton buttonWithType UIButtonTypeCustom button frame CGRectMake 0 0 0 0 25 25 button layer set
  • 有没有办法阻止 Prettier 接触 HTML 文件中的
     块?                
                

    Prettier 通常在 HTML 上做得非常好 但缩进了 pre gt 代码块 我总是希望 pre gt 代码块不缩进 似乎我应该能够在 prettierignore 中配置它 但找不到有效的方法 块如 pre class line nu
  • Telerik().ScriptRegistrar() 如何防止加载 jquery 库?

    即使在之后 脚本注册器也会加载 jquery validation min js Html Telerik ScriptRegistrar jQuery false 有什么办法告诉它不要这样做吗 即使当我尝试加载我需要的内容时 也会这样做
  • 无法删除 docker 镜像,守护进程的错误响应

    我对 ubuntu 还很陌生 所以可能缺少一些简单的东西 我正在尝试删除我的 docker 镜像 sudo docker rmi
  • 当我更改为 RTL 时,material-ui 图标不会翻转

    我用过瑞安 科格斯韦尔的回答 https stackoverflow com questions 62799638 material ui textfield not affected with the rtl direction让我的项目