解决 React.js 输入框单字符输入后失焦问题

解决 React.js 输入框单字符输入后失焦问题

本文深入探讨 React.js 中输入框在每次输入后失焦的常见问题。当输入框的 value 属性直接绑定到组件状态,且该状态在 onChange 事件中频繁更新时,会导致组件不必要的重渲染,进而引发输入框失焦。文章将详细解释其根本原因,并提供基于局部状态管理的解决方案,确保输入流畅性,提升用户体验。

问题现象与根源分析

在 react.js 应用中,开发者可能会遇到一个令人困扰的现象:当用户在输入框中每输入一个字符,输入框就会立即失去焦点,需要重新点击才能继续输入。这种行为严重影响了用户体验,使得正常的文本输入变得异常困难。

这种现象的根本原因在于 React 的渲染机制以及受控组件(Controlled Components)的工作方式。在 React 中,当一个组件的状态发生变化时,React 会触发该组件及其子组件的重新渲染(re-render)。对于受控输入框,其 value 属性通常绑定到组件的状态,并且 onChange 事件处理函数会负责更新这个状态。

考虑以下典型代码模式:

const MyComponent = () => {  const [inputValue, setInputValue] = useState('');  const handleChange = (event) => {    setInputValue(event.target.value); // 每次按键都更新状态  };  return (      );};

当用户输入一个字符时,handleChange 函数被调用,setInputValue 会立即更新 inputValue 状态。由于状态的改变,MyComponent 会重新渲染。在某些情况下,尤其是在列表渲染或组件结构复杂时,这种重新渲染可能导致浏览器重新创建或“重置”DOM 中的 元素。即使元素本身没有被完全替换,其内部状态(如光标位置、焦点)也可能因渲染过程而丢失,从而表现为输入框失焦。

在原问题提供的代码中,handleOnchange 函数直接更新了 dataSource 这个全局状态,而 gridTemplate 中的 绑定了 props.Freight(来源于 dataSource)。这意味着每一次输入都会导致 dataSource 状态更新,进而触发包含 gridTemplate 的整个父组件(或至少是其相关的行)的重新渲染,从而导致输入框失焦。

核心解决方案:局部状态管理

解决此问题的关键在于将输入框的临时值与其最终要更新的全局或父组件状态进行解耦。这意味着输入框自身维护一个局部状态来管理其当前的输入值,而只有在特定时机(例如,输入框失去焦点、用户按下回车键、点击保存按钮等)才将这个局部值同步到外部的全局状态。

这种方法的好处是:

减少不必要的重渲染: 每次按键只更新输入框组件内部的局部状态,不会频繁触发父组件或全局状态的更新,从而避免了大规模的重新渲染。保持焦点: 由于输入框元素本身不会因为每次按键而“重置”,它能持续保持焦点。提升用户体验: 用户可以流畅地输入文本,不会被打断。

示例代码:构建一个可编辑输入单元格

我们可以创建一个独立的受控输入组件,它内部管理自己的状态,并只在必要时通知父组件进行数据更新。

import React, { useState, useEffect } from 'react';/** * 可编辑输入单元格组件 * 该组件内部管理输入框的值,只在特定事件(如失焦)时通知父组件更新。 * * @param {any} initialValue - 输入框的初始值,通常来自父组件的数据源。 * @param {function} onValueCommit - 当值最终确定时(如失焦),调用的回调函数,将新值传递给父组件。 */const EditableInputCell = ({ initialValue, onValueCommit }) => {  // 1. 使用局部状态管理输入框的当前值  //    这个状态只在 EditableInputCell 内部使用,不会立即触发外部组件重渲染。  const [currentValue, setCurrentValue] = useState(initialValue);  // 2. 使用 useEffect 监听 initialValue 的变化  //    当父组件传入的 initialValue 变化时(例如,数据从后端加载完成或外部重置),  //    更新局部状态,确保显示的是最新的外部值。  useEffect(() => {    setCurrentValue(initialValue);  }, [initialValue]);  // 3. onChange 事件处理函数:  //    每次按键只更新局部状态 `currentValue`,不触发 `onValueCommit`。  const handleChange = (event) => {    setCurrentValue(event.target.value);  };  // 4. onBlur 事件处理函数:  //    当输入框失去焦点时,才将局部值提交给父组件。  //    通过比较 `currentValue` 和 `initialValue`,避免不必要的父组件状态更新。  const handleBlur = () => {    if (currentValue !== initialValue) {      onValueCommit(currentValue);    }  };  // 5. 可选:onKeyDown 事件处理函数  //    当用户按下回车键时,模拟失焦行为,同样触发 `onBlur` 提交值。  const handleKeyDown = (event) => {    if (event.key === 'Enter') {      event.target.blur(); // 触发 onBlur 事件    }  };  return (      );};// --- 如何在父组件中使用 EditableInputCell ---// 假设这是你的父组件,管理着 dataSource 状态// import React, { useState } from 'react'; // 如果在同一个文件,可省略const ParentComponent = () => {  const [dataSource, setDataSource] = useState([    { OrderID: 1, Freight: 100 },    { OrderID: 2, Freight: 200 },    { OrderID: 3, Freight: 350 },  ]);  // 这个函数将被传递给 EditableInputCell 的 onValueCommit prop  // 它负责更新父组件的 dataSource 状态  const handleFreightCommit = (orderId, newFreight) => {    setDataSource(prevData =>      prevData.map(item =>        item.OrderID === orderId ? { ...item, Freight: newFreight } : item      )    );  };  return (    

订单运费列表

{dataSource.map(item => ( // 注意:在列表渲染时,为每个元素提供唯一的 key 是非常重要的
订单 ID: {item.OrderID},运费: handleFreightCommit(item.OrderID, newFreight)} />
))}
);};export default ParentComponent;

代码说明:

useState(initialValue): EditableInputCell 内部使用 currentValue 状态来管理输入框的当前显示值。这个状态只属于 EditableInputCell 组件,它的更新不会直接导致父组件 ParentComponent 的重新渲染。useEffect(() => { setCurrentValue(initialValue); }, [initialValue]);: 这个 useEffect 钩子确保当父组件传入的 initialValue 发生变化时(例如,当 dataSource 从外部被更新或重置时),EditableInputCell 的内部状态也能同步更新,从而显示正确的值。handleChange: 仅更新 EditableInputCell 内部的 currentValue 状态。这是每次按键时唯一发生的事情。handleBlur: 当输入框失去焦点时,handleBlur 被调用。此时,我们才将 currentValue 通过 onValueCommit 回调函数传递给父组件,让父组件更新其 dataSource。通过 if (currentValue !== initialValue) 判断,可以避免在值未改变时进行不必要的父组件状态更新。handleKeyDown: 这是一个可选的增强,允许用户通过按下回车键来“提交”输入,这会触发 onBlur 事件,进而调用 onValueCommit。

通过这种方式,输入框在用户输入时能够保持焦点,只有在用户完成输入并离开输入框时,才会触发父组件的数据更新和可能的重新渲染。

注意事项与最佳实践

受控组件与非受控组件: 上述解决方案仍然属于受控组件的范畴,因为输入框的 value 仍然由 React 状态控制。不同之处在于,控制的粒度更细,输入框的“即时”值由自身管理,而“最终”值才同步到外部。对于简单的表单,直接使用父组件状态可能没有问题;但对于复杂或高性能要求的场景,局部状态管理是更好的选择。性能优化: 减少不必要的组件重渲染是 React 性能优化的重要方面。通过局部状态管理,可以显著减少父组件或列表项的渲染频率,从而提升应用性能。用户体验: 这种模式提供了更流畅的输入体验。但需要注意,如果用户在输入后没有触发 onBlur 或 onKeyDown(例如直接关闭页面),那么他们的输入可能不会被保存。在某些应用场景中,可能需要结合防抖(Debouncing)技术,在用户停止输入一段时间后自动提交,以提供更好的实时反馈和保存机制。错误处理与校验: 可以在 onBlur 提交 onValueCommit 之前,对 currentValue 进行格式校验或业务规则校验。如果校验失败,可以阻止提交,并向用户显示错误信息。列表渲染的 key 属性: 尽管与输入框失焦问题不直接相关,但在渲染列表时,为每个列表项提供一个稳定且唯一的 key 属性至关重要。这有助于 React 高效地识别列表中的元素,优化渲染性能,并避免在元素顺序变化时出现意外行为。

总结

React.js 输入框在单字符输入后失焦的问题,其核心在于 value 属性与频繁更新的全局状态直接绑定,导致不必要的组件重渲染。解决此问题的关键在于将输入框的临时输入值与其最终需要更新的外部状态进行解耦。通过在输入框组件内部维护一个局部状态来管理当前输入,并仅在特定事件(如 onBlur 或 onKeyDown)发生时才将值提交给父组件,可以有效避免频繁重渲染,从而保持输入框焦点,显著提升用户输入体验和应用性能。这种局部状态管理的模式,是构建高效、用户友好 React 表单的推荐实践。

以上就是解决 React.js 输入框单字符输入后失焦问题的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1509024.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何用BOM获取用户的鼠标位置?
上一篇 2025年12月20日 05:13:43
PHP与JavaScript数组协同:实现动态数据库批量更新教程
下一篇 2025年12月20日 05:13:53

相关推荐

  • 豆包适配移动端吗 移动设备使用豆包的体验优化建议

    本文将围绕豆包在移动设备上的适配性展开讨论,并提供一系列优化使用体验的具体方法。文章会首先明确豆包对移动端的支持情况,然后通过分步讲解的形式,介绍如何在手机等设备上更高效地进行交互、输入和获取信息,帮助用户掌握提升操作流畅度的实用技巧。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限…

    2026年9月26日
    000
  • vivo浏览器怎么添加书签到桌面_vivo浏览器网页快捷方式添加到桌面教程

    vivo浏览器怎么添加书签到桌面_vivo浏览器网页快捷方式添加到桌面教程vivo浏览器怎么添加书签到桌面_vivo浏览器网页快捷方式添加到桌面教程vivo浏览器怎么添加书签到桌面_vivo浏览器网页快捷方式添加到桌面教程vivo浏览器怎么添加书签到桌面_vivo浏览器网页快捷方式添加到桌面教程

    1、打开vivo浏览器进入目标网页,点击右上角三点菜单选择“添加到桌面”,系统自动创建快捷方式;2、若无此选项,可先将网页保存为书签,再通过书签管理长按条目选择“添加到桌面”生成图标;3、还可借助Nova Launcher等第三方启动器,通过添加网页链接小部件手动输入URL创建快捷方式。 如果您希望…

    2026年9月26日 • 用户投稿
    100
  • 抖音PC版如何使用直播功能_抖音PC版开启直播的详细教程

    抖音PC版如何使用直播功能_抖音PC版开启直播的详细教程抖音PC版如何使用直播功能_抖音PC版开启直播的详细教程抖音PC版如何使用直播功能_抖音PC版开启直播的详细教程抖音PC版如何使用直播功能_抖音PC版开启直播的详细教程

    首先下载安装抖音直播伴侣,然后通过手机扫码登录,接着配置场景、音视频设备及推流参数,最后填写标题并点击“开始推流”即可成功开启电脑直播。 如果您想在电脑上进行直播,以获得更好的画面质量、音效控制和互动体验,但不清楚如何操作,可以按照以下步骤在抖音PC版开启直播。 本文运行环境:联想拯救者Y9000P…

    2026年9月26日 • 用户投稿
    100
  • 360极速浏览器下载任务中断或失败怎么办_下载失败问题排查与解决方法

    360极速浏览器下载任务中断或失败怎么办_下载失败问题排查与解决方法360极速浏览器下载任务中断或失败怎么办_下载失败问题排查与解决方法360极速浏览器下载任务中断或失败怎么办_下载失败问题排查与解决方法360极速浏览器下载任务中断或失败怎么办_下载失败问题排查与解决方法

    360极速浏览器下载失败可尝试关闭下载加速模块、调整IE安全设置、切换默认下载工具、更新浏览器或使用IDM等第三方工具解决。 如果您在使用360极速浏览器下载文件时,发现下载任务频繁中断或直接失败,可能是由于浏览器设置、网络环境或安全策略限制所致。以下是针对此问题的详细排查与解决方法。 本文运行环境…

    2026年9月26日 • 用户投稿
    200
  • 快手视频如何下载保存_快手视频下载保存的简单方法

    快手视频如何下载保存_快手视频下载保存的简单方法快手视频如何下载保存_快手视频下载保存的简单方法快手视频如何下载保存_快手视频下载保存的简单方法快手视频如何下载保存_快手视频下载保存的简单方法

    优先使用快手App内“保存到相册”功能下载公开视频,操作简单且保留原画质;2. 若视频受限制或需无水印版本,可复制链接后通过第三方解析网站提取下载;3. 通用方法为启用手机录屏功能,录制并保存视频内容至相册。 如果您在浏览快手时看到喜欢的视频,想要将其保存到本地设备以便离线观看或分享,但发现部分视频…

    2026年9月26日 • 用户投稿
    000
  • 360极速浏览器账号如何登录和退出_360极速浏览器用户账号登录与注销操作

    360极速浏览器账号如何登录和退出_360极速浏览器用户账号登录与注销操作360极速浏览器账号如何登录和退出_360极速浏览器用户账号登录与注销操作360极速浏览器账号如何登录和退出_360极速浏览器用户账号登录与注销操作360极速浏览器账号如何登录和退出_360极速浏览器用户账号登录与注销操作

    登录360极速浏览器需通过左上角头像或右上角菜单进入登录界面,输入账号密码或使用手机号快捷验证完成登录;如需切换账户或保护隐私,可点击头像后选择退出登录,或通过设置菜单清除Cookie等方式彻底注销并重启浏览器。 如果您在使用360极速浏览器时需要同步收藏夹、设置或使用云服务,则必须先登录您的360…

    2026年9月26日 • 用户投稿
    100
  • grokAI平台官方网站主页 grokAI 智能助手入口官方直达地址

    GrokAI平台官方网站主页是https://grok.com/,用户可直接访问该网址进入。新用户无需注册即可点击“Start Chatting”体验基础功能,登录X账号则可使用高级服务。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ Gr…

    2026年9月26日
    100
  • 从 0 开始学 V8 漏洞利用之 V8 通用利用链(二)

    作者:hcamael@知道创宇404实验室 相关阅读:从 0 开始学 V8 漏洞利用之环境搭建(一)经过一段时间的研究,先进行一波总结,不过因为刚开始研究没多久,也许有一些局限性,以后如果发现了,再进行修正。 概述 ‍我认为,在搞漏洞利用前都得明确目标。比如打CTF做二进制的题目,大部分情况下,目标…

    2026年9月26日
    100
  • x浏览器如何拦截弹窗广告_x浏览器弹窗广告拦截教程

    x浏览器如何拦截弹窗广告_x浏览器弹窗广告拦截教程x浏览器如何拦截弹窗广告_x浏览器弹窗广告拦截教程x浏览器如何拦截弹窗广告_x浏览器弹窗广告拦截教程x浏览器如何拦截弹窗广告_x浏览器弹窗广告拦截教程

    开启x浏览器广告拦截功能可有效屏蔽弹窗广告。首先在设置中启用“广告过滤”并选择强力模式;其次通过自定义规则添加已知广告域名进行精准拦截;接着在隐私与安全设置中开启“阻止弹出窗口”开关,阻断脚本触发的弹窗;最后可使用轻阅读模式简化网页结构,避免广告加载,提升浏览体验。 如果您在浏览网页时频繁遇到弹窗广…

    2026年9月26日 • 用户投稿
    300
  • uc浏览器自动填充表单怎么关闭_UC浏览器关闭表单自动填充功能

    uc浏览器自动填充表单怎么关闭_UC浏览器关闭表单自动填充功能uc浏览器自动填充表单怎么关闭_UC浏览器关闭表单自动填充功能uc浏览器自动填充表单怎么关闭_UC浏览器关闭表单自动填充功能uc浏览器自动填充表单怎么关闭_UC浏览器关闭表单自动填充功能

    关闭UC浏览器自动填充需先在设置中停用智能填写功能,再清除已保存的表单数据,最后在系统设置中禁用自动填充服务以彻底阻止信息被记忆或填充。 如果您在使用UC浏览器时发现表单被自动填充,可能会影响隐私或输入准确性。为了更好地控制个人信息的输入方式,您可以按照以下方法关闭自动填充功能。 本文运行环境:小米…

    2026年9月26日 • 用户投稿
    000
  • 2025Yandex俄罗斯搜索引擎官网入口 Yandex网页版搜索地址与浏览器登录指南

    2025Yandex俄罗斯搜索引擎官网入口 Yandex网页版搜索地址与浏览器登录指南2025Yandex俄罗斯搜索引擎官网入口 Yandex网页版搜索地址与浏览器登录指南2025Yandex俄罗斯搜索引擎官网入口 Yandex网页版搜索地址与浏览器登录指南2025Yandex俄罗斯搜索引擎官网入口 Yandex网页版搜索地址与浏览器登录指南

    展望2025年,yandex将继续作为俄罗斯领先的互联网门户。无论您是想直接使用其强大的网页版搜索功能,还是希望登录yandex浏览器以同步您的个人数据,获取一个稳定、官方的入口地址是第一步。本篇指南将为您提供最权威的官网入口信息,并附上清晰的网页与浏览器登录步骤。 yandx免费看电影的APP☜☜…

    2026年9月26日 • 用户投稿
    100
  • 俄罗斯yandex主页手机版入口 yandex入口引擎无需登录手机链接

    俄罗斯yandex主页手机版入口 yandex入口引擎无需登录手机链接俄罗斯yandex主页手机版入口 yandex入口引擎无需登录手机链接俄罗斯yandex主页手机版入口 yandex入口引擎无需登录手机链接俄罗斯yandex主页手机版入口 yandex入口引擎无需登录手机链接

    Yandex,作为俄罗斯本土最大的互联网公司,其搜索引擎在全球范围内享有盛誉,尤其在俄语市场占据绝对主导地位。其精心优化的手机版主页入口,旨在为全球移动用户提供极致便捷的上网体验,让用户无论身处何地,都能通过无需登录的快速链接,瞬时直达其功能异常丰富的综合性平台。 一、正确的官网地址 要直接进入俄罗…

    2026年9月26日 • 用户投稿
    000
  • yandex引擎入口无需登录进入网站地址

    yandex引擎入口无需登录进入网站地址yandex引擎入口无需登录进入网站地址yandex引擎入口无需登录进入网站地址yandex引擎入口无需登录进入网站地址

    Yandex引擎无需登录的直接访问地址是https://yandex.com/,该网站提供高效精准的搜索体验,支持多语言检索,尤其擅长俄语及东欧、中亚地区语言处理,具备本地化信息匹配能力,并集成图片、视频、新闻、地图等垂直分类功能;用户无需注册即可使用全部基础服务,包括文本、语音和图像搜索,个性化设…

    2026年9月26日 • 用户投稿
    100
  • 俄版搜索引擊主页yandex入口 俄罗斯浏览器搜索引擎入口yandex链接

    俄版搜索引擊主页yandex入口 俄罗斯浏览器搜索引擎入口yandex链接俄版搜索引擊主页yandex入口 俄罗斯浏览器搜索引擎入口yandex链接俄版搜索引擊主页yandex入口 俄罗斯浏览器搜索引擎入口yandex链接俄版搜索引擊主页yandex入口 俄罗斯浏览器搜索引擎入口yandex链接

    Yandex,被誉为“俄罗斯的谷歌”,是该国最大的互联网技术公司和搜索引擎。本文将为您清晰介绍Yandex的主要官方入口链接,并简要说明其核心功能,帮助您快速了解和使用这个强大的信息工具。 一、Yandex是什么? 1、立即进入“☞☞☞☞点击俄版搜索引擊主页yandex入口☜☜☜☜”; 2、立即进入…

    2026年9月26日 • 用户投稿
    000
  • 英特尔 NUC 主机程序崩溃?三星 SSD 主控老化掉速诊断​

    英特尔 NUC 主机程序崩溃?三星 SSD 主控老化掉速诊断​英特尔 NUC 主机程序崩溃?三星 SSD 主控老化掉速诊断​英特尔 NUC 主机程序崩溃?三星 SSD 主控老化掉速诊断​英特尔 NUC 主机程序崩溃?三星 SSD 主控老化掉速诊断​

    英特尔 nuc 主机程序崩溃,很可能是三星 ssd 主控老化掉速引起。1. 通过检查系统日志查看是否有磁盘错误信息;2. 使用 crystaldiskinfo 等工具读取 smart 信息判断 ssd 健康状态;3. 尝试更换 ssd 验证是否为原 ssd 问题。若确认为 ssd 老化掉速,可优化 …

    2026年9月26日 • 用户投稿
    000
  • yandex搜索引擎入口地址 yandex网页入口引擎直达

    yandex搜索引擎入口地址 yandex网页入口引擎直达yandex搜索引擎入口地址 yandex网页入口引擎直达yandex搜索引擎入口地址 yandex网页入口引擎直达yandex搜索引擎入口地址 yandex网页入口引擎直达

    Yandex作为一款功能强大的搜索引擎,尤其在图像搜索和东欧语系内容方面表现出色,是许多用户的优选工具。本文将为您提供Yandex网页版的核心入口地址,并解析不同入口的特点,帮助您根据需求快速、直接地访问。 1、立即进入“☞☞☞☞点击yandex搜索引擎入口地址☜☜☜☜”; 2、立即进入“☞☞☞☞点…

    2026年9月26日 • 用户投稿
    000
  • uc浏览器后台播放视频怎么设置_UC浏览器实现视频后台播放技巧

    uc浏览器后台播放视频怎么设置_UC浏览器实现视频后台播放技巧uc浏览器后台播放视频怎么设置_UC浏览器实现视频后台播放技巧uc浏览器后台播放视频怎么设置_UC浏览器实现视频后台播放技巧uc浏览器后台播放视频怎么设置_UC浏览器实现视频后台播放技巧

    UC浏览器支持后台播放,需开启悬浮窗权限或使用小窗/画中画功能。首先在设置中为UC浏览器授权“显示在其他应用上层”,播放视频后点击小窗按钮进入浮动窗口模式;若未自动触发,可手动在菜单选择“小窗播放”;同时在系统设置中启用画中画权限,并确保UC浏览器为最新版本,以实现锁屏或切换应用时持续播放。 如果您…

    2026年9月26日 • 用户投稿
    000
  • uc浏览器夸克网盘入口在哪里_UC浏览器内置夸克网盘功能入口

    uc浏览器夸克网盘入口在哪里_UC浏览器内置夸克网盘功能入口uc浏览器夸克网盘入口在哪里_UC浏览器内置夸克网盘功能入口uc浏览器夸克网盘入口在哪里_UC浏览器内置夸克网盘功能入口uc浏览器夸克网盘入口在哪里_UC浏览器内置夸克网盘功能入口

    1、打开UC浏览器并登录账号,向下滑动首页查找“常用服务”或“工具箱”中的夸克网盘图标;2、若未找到,点击右上角“三”图标,在菜单中查找网盘、云盘或“我的文件”选项;3、仍无结果时,可在顶部搜索框输入“夸克网盘”,从推荐服务中点击“直达”链接进入;4、最后检查设置中的“插件管理”,确保夸克网盘插件已…

    2026年9月26日 • 用户投稿
    100
  • 如何在Debian中自定义GitLab界面

    在debian中自定义gitlab界面可以通过以下几种方式进行: 更改界面语言为中文 登录GitLab并进入设置:打开浏览器,访问GitLab的URL。使用管理员账号登录。点击右上角的用户头像,选择“Settings”(设置)。修改用户界面语言:在左侧导航栏中找到“Preferences”(偏好设置…

    2026年9月26日
    200
  • UC浏览器怎么开启桌面版网页_UC浏览器桌面版网页开启方法

    1、打开UC浏览器点击右上角三点菜单,勾选“桌面版”即可切换;2、通过设置中的“浏览器标识”选择“桌面”模式可默认加载桌面版网页;3、长按地址栏并选择“请求桌面版网站”也能快速切换。 如果您在使用UC浏览器时发现网页显示为移动版,部分内容无法正常查看或操作,可能需要切换至桌面版模式以获得更完整的页面…

    2026年9月26日
    000

发表回复

登录后才能评论
关注微信