我的编程空间,编程开发者的网络收藏夹
学习永远不晚

React 19 终于来了!带来了诸多新特性和改进

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

React 19 终于来了!带来了诸多新特性和改进

早在数月前,React 团队便预告了 React 19 的积极开发,并预计上半年发布。 4 月 25 日,React 终于发布了 v19 测试版。该版本主要面向各大库,以确保它们与 React 19 的兼容性。因此,建议开发者先升级至最新的稳定版 18.3.0,静待 React 19 的正式版发布。

React 19 带来了诸多新特性和改进,不仅提升了开发者的使用体验,还进一步优化了 React 应用的性能。为了让开发者能够平稳过渡到 React 19,React 团队特意准备了一份详尽的升级指南,详细列出了升级步骤和可能遇到的重大变化。

接下来,本文将剖析 React 18.3 与 React 19 的更新内容,并探索 React 19 的升级指南,助力更好地拥抱这一重大更新!

React 18.3 更新内容

React 18.3 相对于 18.2 增加了对废弃 API 的警告以及其他为 React 19 所需的更改。

  1. React
  • 允许向 this.refs 写入以支持字符串 ref 的代码模式转换。
  • 在 StrictMode 外部使用已废弃的 findDOMNode 时,将发出警告。
  • 对使用已废弃的测试工具方法时发出警告。
  • 在 StrictMode 外部使用已废弃的遗留 Context 时,将发出警告。
  • 在 StrictMode 外部使用已废弃的字符串 ref 时,将发出警告。
  • 对函数组件中使用已废弃的 defaultProps 发出警告。
  • 当在组件或元素中展开 key 时,将发出警告。
  • 从测试工具中使用 act 时,如果方式不当,将发出警告。
  1. React DOM
  2. 对使用已废弃的 unmountComponentAtNode 方法时发出警告。
  3. 对使用已废弃的 renderToStaticNodeStream 方法时发出警告。

React 19 更新内容

Actions

在React应用中,执行数据变更并据此更新状态是一个常见的需求。比如,用户提交表单以更改姓名时,我们会发起API请求并处理其响应。以往,我们不得不手动管理挂起状态、错误处理、乐观更新以及顺序请求等逻辑。

例如,可以使用useState来处理挂起和错误状态:

function UpdateName({}) {
  const [name, setName] = useState("");
  const [error, setError] = useState(null);
  const [isPending, setIsPending] = useState(false);

  const handleSubmit = async () => {
    setIsPending(true);
    const error = await updateName(name);
    setIsPending(false);
    if (error) {
      setError(error);
      return;
    } 
    redirect("/path");
  };

  return (
    
setName(event.target.value)} /> {error &&

{error}

}
); }

在 React 19 中增加了对在转换中使用异步函数的支持,以自动处理挂起状态、错误、表单和乐观更新。

例如,可以使用useTransition来自动处理挂起状态:

function UpdateName({}) {
  const [name, setName] = useState("");
  const [error, setError] = useState(null);
  const [isPending, startTransition] = useTransition();

  const handleSubmit = async () => {
    startTransition(async () => {
      const error = await updateName(name);
      if (error) {
        setError(error);
        return;
      } 
      redirect("/path");
    })
  };

  return (
    
setName(event.target.value)} /> {error &&

{error}

}
); }

异步转换会立刻将isPending状态设为true,发起异步请求,并在转换完成后将isPending设置为false。这样可以确保数据变化时,UI 仍然保持响应和交互性。

在 Actions 功能的基础上,React 19 还推出了useOptimistic Hook 来简化乐观更新的管理,以及 React.useActionState Hook来处理 Actions 的常见场景。同时,在 react-dom 中,新增了

 Actions 来自动管理表单操作,并提供了useFormStatus 来支持表单中 Actions 的常见需求。

在 React 19 中,上面的例子可以简化为:

function ChangeName({ name, setName }) {
  const [error, submitAction, isPending] = useActionState(
    async (previousState, formData) => {
      const error = await updateName(formData.get("name"));
      if (error) {
        return error;
      }
      redirect("/path");
    }
  );

  return (
    
      
      
      {error && 

{error}

} ); }

下面就来看看这些新的 Actions 功能的作用和使用方法。

全新 Hook:useActionState

为了让常见的 Action 用例更加简便,因此添加了一个名为useActionState的新 Hook:

const [error, submitAction, isPending] = useActionState(async (previousState, newName) => {  
  const error = await updateName(newName);  
  
  if (error) {  
    // 可以返回Action的任何结果,这里只返回错误信息。  
    return error;  
  }  
  
  // 处理成功的情况  
});

useActionState接受一个函数(即“Action”),并返回一个可调用的包装 Action。这之所以能够工作是因为Actions是可组合的。当调用包装后的Action时,useActionState将返回Action的最后一个结果作为数据,并将Action的挂起状态作为pending返回。

React DOM: 
 Actions

在 React 19 中,Actions 与 react-dom 的新  特性进行了深度整合。现在,可以将函数作为、

useFormStatus可以读取父级的状态,就像该表单是一个Contextprovider 一样。

全新 Hook:useOptimistic

在数据变更操作中,一种常见的 UI 模式是在异步请求执行期间乐观地显示预期的最终状态。React 19 引入了新的useOptimistic Hook,以简化这一流程:

function ChangeName({currentName, onUpdateName}) {
  const [optimisticName, setOptimisticName] = useOptimistic(currentName);

  const submitAction = async formData => {
    const newName = formData.get("name");
    setOptimisticName(newName);
    const updatedName = await updateName(newName);
    onUpdateName(updatedName);
  };

  return (
    
      

Your name is: {optimisticName}

); }

在这个例子中,useOptimistic Hook 允许在updateName请求还在进行时,立即将输入框的值(即newName)设置为optimisticName,从而乐观地更新UI。如果更新成功,则通过onUpdateName回调函数来确认状态的更改;如果更新失败或发生错误,可以通过setOptimisticName回滚到原始状态currentName。

全新 API:use

在React 19中,引入了一个全新的API——use,它允许在组件渲染时直接读取资源。

举个例子,可以使用use来读取一个Promise对象,而React将会自动挂起(Suspend)组件的渲染,直到该Promise解析完成:

import { use } from 'react';  
  
function Comments({ commentsPromise }) {  
  // 使用use读取Promise,React会在Promise解析前挂起组件渲染  
  const comments = use(commentsPromise);  
  
  return (  
    
{comments.map((comment) => (

{comment.text}

))}
); } function Page({ commentsPromise }) { // 当Comments组件因use挂起时,这里会显示Suspense的fallback内容 return ( 加载中...
}> ); }

同样可以使用use来读取上下文(Context),从而实现在特定条件下(例如早期返回之后)按需读取上下文数据。

早期返回指的是在函数或方法中的某个点提前结束执行,并返回结果或退出,而不是继续执行剩余的代码。在函数内部,根据某些条件或逻辑,你可能会决定不需要继续执行后续的代码,此时可以使用return语句来立即退出函数。

import {use} from 'react';
import ThemeContext from './ThemeContext'

function Heading({children}) {
  if (children == null) {
    return null;
  }
   
  // 使用 useContext 在这里不会生效 ,因为存在早期返回。
  const theme = use(ThemeContext);
  return (
    
  );
}

use API 的调用仅限于渲染阶段,与 React 的 Hook 类似。然而,与 Hook 不同的是,use API 允许在条件语句中灵活调用。展望未来,React 团队计划进一步扩展 use API 的功能,提供更多在渲染时消费资源的方式。

React 服务器组件

服务器组件

服务器组件是一种创新性的技术,它允许在打包前,在独立于客户端应用程序或服务器端渲染(SSR)服务器的环境中预先渲染组件。这个独立的环境即为React服务器组件中的“服务器”。服务器组件有两种运行模式:一种是在构建时(例如在持续集成服务器上)运行一次;另一种是针对每个请求,通过 Web 服务器进行实时运行。

React 19 全面集成了来自 Canary 频道的所有服务器组件特性。这意味着,那些带有服务器组件的库现在可以将 React 19 作为对等依赖项进行目标定位,并通过 react-server 导出条件,为支持全栈 React 架构的框架提供强大的支持。

服务器操作

服务器动作是一项强大功能,它允许客户端组件调用并执行在服务端的异步函数。

通过“use server”指令定义服务器操作后,框架将智能地创建一个指向服务端函数的引用,并安全地将该引用传递给客户端组件。当客户端组件需要调用这个函数时,React 会负责向服务器发送请求,执行相应的函数,并将结果返回给客户端。

服务器操作的创建非常灵活,既可以在服务器组件内部创建,并作为属性传递给客户端组件使用;也可以直接在客户端组件中导入并调用。这种设计使得服务器操作能够无缝集成到应用中,实现前后端数据的流畅交互。

功能改进

ref 作为属性

从 React 19 开始,可以将 ref 作为函数组件的参数进行访问:

function MyInput({placeholder, ref}) {  
  return   
}  
  
//...  
  

新的函数组件将不再需要 forwardRef,React 团队将会发布一个代码转换工具来自动更新组件,以使用新的 ref 属性。在未来的版本中,将弃用并移除 forwardRef。

水合错误报告

React 19 在 react-dom 中对水合错误的报告进行了优化。过去,在开发模式下遇到水合不匹配时,系统往往只记录多个错误,而缺乏关于不匹配内容的具体信息。现在,引入了 diff 功能,使得客户端渲染与服务端渲染内容之间的差异一目了然。这一改进不仅提升了错误报告的清晰度,更有助于开发者迅速定位并修复水合相关问题,从而大幅提升开发效率。

现在只会记录一条包含不匹配内容差异的消息:

作为提供者

React 19 允许直接将  用作提供者,而无需使用传统的  写法:

const ThemeContext = createContext('');  
  
function App({children}) {  
  return (  
      
      {children}  
      
  );  
}

这种新的语法更加简洁直观。为了方便开发者升级现有代码,React 团队将发布一个代码转换工具,能够自动将现有的  转换为新的  提供者。未来版本中,将逐步弃用 ,以推动 React 社区向更加简化的语法过渡。

refs 清理函数

现在支持从 ref 回调函数中返回一个清理函数:

 {  
    // 创建 ref  
  
    // 新增:返回一个清理函数,当元素从 DOM 中移除时重置 ref。  
    return () => {  
      // ref 的清理工作  
    };  
  }}  
/>

当组件卸载时,React 将调用从 ref 回调函数中返回的清理函数。这适用于 DOM refs、类组件的 refs 以及 useImperativeHandle。

由于引入了 ref 清理函数的机制,现在 TypeScript 将拒绝从 ref 回调函数中返回除清理函数以外的任何内容。为了避免这个问题,我们通常建议避免使用隐式返回,比如将赋值操作放在花括号中,如下所示:

(instance = current)} />
{ instance = current; }} />

这种改变是因为 TypeScript 无法判断原始代码中返回的是否应该是清理函数,还是无意中的隐式返回值。通过将赋值操作明确地包裹在花括号中,确保了 ref 回调中不会意外地返回任何值,除非有意为之。

为了自动化这种模式的转换,可以使用 no-implicit-ref-callback-return 规则进行代码转换。这将帮助你在升级 React 版本时更顺畅地处理 ref 相关的代码。

useDeferredValue 的初始值

React 19 为 useDeferredValue 引入了 initialValue 选项,该选项允许指定组件首次渲染时返回的值。

function Search({ deferredValue }) {  
  // 在组件首次渲染时,返回 initialValue 作为 value。  
  // 随后,useDeferredValue 会在后台计划一次重渲染,使用 deferredValue 作为新的 value。  
  const value = useDeferredValue(deferredValue, { initialValue: '' });  
  
  return (  
      
  );  
}

使用 initialValue 可以确保组件在首次渲染时能够立即显示一个占位值,而无需等待 deferredValue 的异步计算完成。随后,当 deferredValue 准备好时,useDeferredValue 会触发组件的后台重渲染,以显示最新的值。这有助于提升应用的响应性和用户体验。

文档元数据支持

在HTML中,诸如、<link>和<meta>等文档元数据标签通常放置在<head>区域内。然而,在React应用中,决定哪些元数据适用于当前页面的组件可能并不直接位于渲染<head>的位置,甚至React可能根本不直接渲染<head>。过去,这些元数据标签需要手动通过effect或借助如react-helmet这样的库进行插入,且在服务器渲染React应用时需要特别小心处理。</p><p>React 19引入了原生支持在组件中渲染文档元数据标签的功能。这意味着可以直接在组件内部定义这些标签,React会自动将它们提升到文档的<head>部分。这一改进确保了元数据标签能够在仅客户端应用、流式服务端渲染(SSR)以及服务器组件等场景下正常工作。</p><p>下面是一个简单的示例,展示了如何在React组件中定义并使用这些元数据标签:</p><div><pre class="line-numbers"><code class="language-php"><code>function BlogPost({ post }) { return ( <article> {} <title>{post.title}

Eee equals em-see-squared...

); }

在这个BlogPost组件中,尽管、<meta>和<link>标签被定义在了<article>内部,但React会在渲染时自动将它们移至文档的<head>区域。这种方式简化了元数据的管理,还增强了React应用在各种渲染模式下的兼容性和灵活性。</p><h4 style="line-height: 1.5;">样式表支持</h4><p>在Web开发中,样式表的管理至关重要,无论是通过外部链接(<link rel="stylesheet" href="...">)还是内嵌方式(<style>...</style>)引入,都需要在 DOM 中精准布局,以确保样式优先级得到妥善处理。然而,构建一个能够支持组件内部样式表组合的机制往往十分繁琐,因此开发者常常面临权衡:要么将样式远离其依赖的组件加载,牺牲组织性;要么依赖外部样式库,增加额外的复杂性。</p><p>React 19 针对这一挑战提供了内置支持,不仅简化了样式表的管理流程,还进一步增强了与客户端并发渲染和服务器端流式渲染的集成能力。通过指定样式表的优先级,React 将自动处理样式表在DOM中的插入顺序,确保在展示依赖于特定样式规则的内容之前,相关的样式表(无论外部还是内嵌)已经被加载并应用。</p><div><pre class="line-numbers"><code class="language-php"><code>function ComponentOne() { return ( <Suspense fallback="loading..."> <link rel="stylesheet" href="foo" precedence="default" /> <link rel="stylesheet" href="bar" precedence="high" /> <article class="foo-class bar-class"> {...} </article> </Suspense> ) } function ComponentTwo() { return ( <div> <p>{...}</p> <link rel="stylesheet" href="baz" precedence="default" /> <-- will be inserted between foo & bar </div> ) }</code></code></pre></div><p>在服务端渲染过程中,React会将样式表包含在<head>标签中,以确保浏览器在加载完成前不会进行页面绘制。如果在已经开始流式传输后才发现样式表,React 将确保在客户端将样式表插入到<head>标签中,然后再展示依赖于该样式表的Suspense边界的内容。</p><p>在客户端渲染过程中,React会等待新渲染的样式表加载完成后再提交渲染结果。如果在应用中的多个位置渲染了这个组件,React将确保样式表在文档中只被包含一次。</p><div><pre class="line-numbers"><code class="language-php"><code>function App() { return <> <ComponentOne /> ... <ComponentOne /> // 不会导致 DOM 中出现重复的样式表链接 </> }</code></code></pre></div><p>对于那些习惯于手动加载样式表的开发者来说,React 19 的这一改进为他们提供了一个便利的机会。现在,可以将样式表直接放在依赖它们的组件旁边,这不仅有助于提升代码的可读性和可维护性,使得开发者可以更加清晰地了解每个组件的样式依赖关系,而且还能够确保只加载真正需要的样式表。</p><p>此外,样式库和与打包器集成的样式工具也可以采用这一新特性。即使开发者不直接渲染自己的样式表,只要他们所使用的工具升级到支持这一功能,他们同样能够享受到这一改进带来的好处。</p><h4 style="line-height: 1.5;">异步脚本支持</h4><p>在HTML中,普通脚本(<script class="lazy" data-src="...">)和延迟脚本(<script defer class="lazy" data-src="...">)按照文档顺序加载,这限制了它们在组件树深处的灵活使用。然而,异步脚本能够以任意顺序加载,为开发者提供了更大的灵活性。</p><p>React 19 针对异步脚本提供了增强的支持,允许开发者在组件树的任何位置渲染它们,直接放在实际依赖该脚本的组件内部。这大大简化了脚本的管理,无需再担心脚本实例的重新定位和去重问题。</p><p>现在,你可以在组件中这样使用异步脚本:</p><div><pre class="line-numbers"><code class="language-php"><code>function MyComponent() { return ( <div> <script async class="lazy" data-src="..." /> Hello World </div> ); } function App() { return ( <html> <body> <MyComponent /> ... <MyComponent /> // 不会导致DOM中出现重复的脚本 </body> </html> ); }</code></code></pre></div><p>在所有渲染环境中,异步脚本都将进行去重处理,因此即使多个不同的组件渲染了同一个脚本,React 也只会加载和执行该脚本一次。</p><p>在服务端渲染中,异步脚本将被包含在<head>标签中,并优先于阻止绘制的更关键资源(如样式表、字体和图像预加载)之后加载。</p><h4 style="line-height: 1.5;">资源预加载支持</h4><p>在文档初始加载和客户端更新时,及时告知浏览器可能即将需要加载的资源,对于提升页面性能至关重要。React 19 引入了一系列新的API,旨在简化浏览器资源的加载和预加载过程,让开发者能够构建出流畅且高效的用户体验。</p><div><pre class="line-numbers"><code class="language-php"><code>import { prefetchDNS, preconnect, preload, preinit } from 'react-dom'; function MyComponent() { preinit('https://.../path/to/some/script.js', { as: 'script' }); // 提前加载并执行脚本 preload('https://.../path/to/font.woff', { as: 'font' }); // 预加载字体 preload('https://.../path/to/stylesheet.css', { as: 'style' }); // 预加载样式表 prefetchDNS('https://...'); // 当可能会从该主机请求资源但尚不确定时 preconnect('https://...'); // 当确定会从该主机请求资源但不确定具体资源时 }</code></code></pre></div><p>这些 API 调用会在渲染组件时生成相应的DOM标签,如下所示:</p><div><pre class="line-numbers"><code class="language-php"><code><html> <head> <!-- 链接根据其对页面加载的贡献程度进行优先级排序 --> <link rel="prefetch-dns" href="https://..."> <!-- DNS预获取 --> <link rel="preconnect" href="https://..."> <!-- 提前建立连接 --> <link rel="preload" as="font" href="https://.../path/to/font.woff"> <!-- 预加载字体 --> <link rel="preload" as="style" href="https://.../path/to/stylesheet.css"> <!-- 预加载样式表 --> <script async class="lazy" data-src="https://.../path/to/some/script.js"></script> <!-- 异步加载并执行脚本 --> </head> <body> ... </body> </html></code></code></pre></div><p>通过利用这些API,开发者可以优化页面的初始加载速度,减少用户等待时间。同时,在客户端更新时,预取和预加载资源也能帮助加快导航速度,提升用户体验。无论是通过预加载字体和样式表来减少页面渲染阻塞,还是通过预取DNS和预连接来加速资源请求,这些API都为开发者提供了强大的工具,使资源加载更加智能和高效。</p><h4 style="line-height: 1.5;">与第三方脚本和扩展的兼容性</h4><p>在React 19中,对挂载过程进行了优化,以更好地兼容第三方脚本和浏览器扩展。</p><p>在客户端挂载时,如果渲染的元素与服务器返回的HTML中的元素不一致,React会触发客户端的重新渲染,以确保内容的正确性。然而,过去,若第三方脚本或浏览器扩展插入了某些元素,这会导致不匹配错误并触发不必要的客户端渲染。</p><p>现在,React 19 能够智能地跳过<head>和<body>中的意外标签,从而避免了因这些元素引发的不匹配错误。即使因为其他原因需要进行整个文档的重新渲染,React也会保留由第三方脚本和浏览器扩展插入的样式表,确保页面的完整性和一致性。</p><h4 style="line-height: 1.5;">更好的错误报告</h4><p>React 19 对错误处理进行了优化,旨在消除错误信息的重复,并为处理捕获和未捕获的错误提供了更多选项。例如,当渲染过程中发生错误并被错误边界捕获时,以前 React 会重复抛出相同的错误(一次是原始错误,另一次是在尝试自动恢复失败后),然后调用console.error输出错误发生位置的信息。</p><p>这种处理方式导致每个被捕获的错误都会被报告三次:</p><p style="text-align:center;"></p><p>在 React 19 中将记录单个错误,并包含所有错误信息:</p><p style="text-align:center;"></p><p>此外,为了提供更细粒度的错误处理控制,还新增了两个根选项来与onRecoverableError相辅相成:</p><ul data-id="u738a58b-ZeNRQARD"><li data-id="ld70c578-Qjw3jJny">onCaughtError:当React在错误边界中成功捕获到错误时,此选项将被调用。</li><li data-id="ld70c578-yzodpt4h">onUncaughtError:当错误被抛出且未能被任何错误边界捕获时,此选项将被触发。</li><li data-id="ld70c578-aDlJnXhz">onRecoverableError:当错误发生但React能够自动恢复时,该选项将起作用。</li></ul><p>这些新增选项不仅增强了React的错误处理能力,还赋予了开发者在不同错误场景下执行特定逻辑的能力。无论是进行错误日志的记录、发送错误报告,还是执行其他自定义操作,这些选项都能满足开发者的需求,帮助他们更有效地管理和应对React应用中的错误情况。</p><h4 style="line-height: 1.5;">自定义元素支持</h4><p>React 19 现已正式加入对自定义元素的全方位支持,并成功通过<span> Custom Elements Everywhere </span>的所有测试。</p><p>在过去,React 对于自定义元素的处理并不尽如人意,因为它往往将未识别的属性(props)默认为属性(attributes)而非属性(properties)。然而,在 React 19 中增加了对属性的支持,这种支持既适用于客户端也适用于服务器端渲染(SSR),具体策略如下:</p><ul data-id="u738a58b-12X9rI7h"><li data-id="ld70c578-u0VRS3F1">在服务端渲染时,如果传递给自定义元素的属性(props)是基本数据类型(如字符串、数字或值为true),它们将作为属性(attributes)进行渲染。相反,如果属性的类型是非基本类型(如对象、符号、函数或值为false),它们将不会被渲染,确保了数据的正确性和一致性。</li><li data-id="ld70c578-IvSl9hwz">在客户端渲染时,React 19 则更加智能地处理属性。如果属性(props)与自定义元素实例上的属性(properties)相匹配,它们将被直接设置为属性(properties)。否则,它们将作为属性(attributes)进行分配。这种处理方式不仅提升了性能,还使得React在处理自定义元素时更加准确和高效。</li></ul><h2 style="line-height: 1.5;">React 19 升级指南</h2><p>React 19 的升级带来了一系列重要的改进,尽管其中涉及到一些破坏性变更,但 React 团队已经努力使升级过程变得更顺畅,预计对大多数应用的影响有限。</p><blockquote style="margin-top: 5px; margin-bottom: 5px; padding-left: 1em; margin-left: 0px; border-left: 3px solid rgb(238, 238, 238); opacity: 0.6;"><p><strong>注意:</strong><span> </span>此 beta 版的主要目的是帮助库开发者为即将到来的React 19做好准备。对于应用开发者而言,建议先升级到React 18.3.0 版本,并耐心等待 React 19 稳定版的发布。React 团队正与库开发者紧密合作,并根据他们的反馈进行必要的调整和改进。为了降低升级难度,React 同步推出了 18.3 版本,以帮助开发者更好地适应未来的变更。</p></blockquote><p>React 19 升级指南:<span><a target="_blank" href="https://react.dev/blog/2024/04/25/react-19-upgrade-guide。">https://react.dev/blog/2024/04/25/react-19-upgrade-guide。</a></span></p></div><div class="myShow contentBtmshow"><div class="mzsming"><p class="mzsm_title">免责声明:</p><p>① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。</p><p>② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341</p></div></div><div class="gDetailKeyword"><div class="gKeyword fl"><a href="/tag/React/" target="_blank" class="b">React</a><a href="/tag/19/" target="_blank" class="b">19</a><a href="/tag/更新/" target="_blank" class="b">更新</a><a href="/tag/前端/" target="_blank" class="b">前端</a></div><div class="clearboth"></div></div><div class="contentBottom clearfix"><a href="https://mp.weixin.qq.com/s/mfpTfgPJJIV1_E1M1MHfFA" class="readOriginal fl">来源:前端充电宝</a><a href="" class="contentComplain fr">内容投诉</a><div class="clearboth"></div></div></div><div class="downLoad clearfix"><div class="downIntro fl"><span class="icon icon_downdoc bg_content bg_word"></span><div class="downtxtIntro"><h4>React 19 终于来了!带来了诸多新特性和改进</h4><p>下载Word文档到电脑,方便收藏和打印~</p></div></div><div class="downBtn fr bg_content bg_down">下载Word文档</div></div><div class="contentRelateArticle"><div class="articleRecommend"><h2><div class="fl">相关文章</div><div class="clearboth"></div></h2><ul class="clearfix"><li><a href="https://www.528045.com/article/4mkn6jpbz3.html" title="在 eclipse 中如何进行 java 代码规范设置?(eclipse下java代码规范设置)">在 eclipse 中如何进行 java 代码规范设置?(eclipse下java代码规范设置)</a></li><li class="last"><a href="https://www.528045.com/article/njdqww1sn1.html" title="如何在 Java 分布式架构中避免错误?(Java分布式架构如何避免错误)">如何在 Java 分布式架构中避免错误?(Java分布式架构如何避免错误)</a></li><li><a href="https://www.528045.com/article/v3e5jfgsl8.html" title="如何利用 Java 多线程来进行数据统计?(怎么用java多线程统计数据)">如何利用 Java 多线程来进行数据统计?(怎么用java多线程统计数据)</a></li><li class="last"><a href="https://www.528045.com/article/ptmenr0s6w.html" title="掌握Ruby加密与解密:确保数据安全的关键步骤">掌握Ruby加密与解密:确保数据安全的关键步骤</a></li><li><a href="https://www.528045.com/article/hoqpk6zvt8.html" title="在 Java 中,try 语句的具体使用方法究竟是什么?(java中try的使用方法是什么)">在 Java 中,try 语句的具体使用方法究竟是什么?(java中try的使用方法是什么)</a></li><li class="last"><a href="https://www.528045.com/article/8g9avh0n3i.html" title="如何在 Linux 系统中监控 Java 线程池?(linux怎么监控java线程池)">如何在 Linux 系统中监控 Java 线程池?(linux怎么监控java线程池)</a></li><li><a href="https://www.528045.com/article/isyhqstwge.html" title="如何利用 Java 中的 random 函数达成随机排序?(怎样使用java中random函数实现随机排序)">如何利用 Java 中的 random 函数达成随机排序?(怎样使用java中random函数实现随机排序)</a></li><li class="last"><a href="https://www.528045.com/article/viijtxq2ym.html" title="在 IDEA 中如何使用 Java 语言连接 MySQL 并实现增、删、查操作?(IDEA中使用Java语言连接MySQL实现增、删、查操作)">在 IDEA 中如何使用 Java 语言连接 MySQL 并实现增、删、查操作?(IDEA中使用Java语言连接MySQL实现增、删、查操作)</a></li><li><a href="https://www.528045.com/article/frbv8z7m9v.html" title="如何在 Java 中正确使用 Thread.join()?(Java中Thread.join()的使用方法)">如何在 Java 中正确使用 Thread.join()?(Java中Thread.join()的使用方法)</a></li><li class="last"><a href="https://www.528045.com/article/62ix8sti0q.html" title="Java 中 Spock 框架的社区支持与资源相关疑问解答(Java中Spock框架的社区支持和资源)">Java 中 Spock 框架的社区支持与资源相关疑问解答(Java中Spock框架的社区支持和资源)</a></li><div class="clearboth"></div></ul></div></div><div class="seeArt"><h3 class="title"><div class="fl"><span class="icon bg_content bg_icon_kyk"></span><span class="name">猜你喜欢</span></div><div class="clearboth"></div></h3><div class="articleBox"><div class="articleList clearfix"><div class="intro"><a title="React 19 终于来了!带来了诸多新特性和改进" href="/article/3e8c43b4f9.html"><h4>React 19 终于来了!带来了诸多新特性和改进</h4></a><div class="des">React 19 的升级带来了一系列重要的改进,尽管其中涉及到一些破坏性变更,但 React 团队已经努力使升级过程变得更顺畅,预计对大多数应用的影响有限。本文将剖析 React 18.3 与 React 19 的更新内容,并探索 Reac</div></div><div class="articleBottom"><a href="/tag/React/" title="React" class="ren-summary-tag" style="color: #fff!important;background-color: #958ef2;">React</a><a href="/tag/19/" title="19" class="ren-summary-tag" style="color: #fff!important;background-color: #9961dd;">19</a><a href="/tag/更新/" title="更新" class="ren-summary-tag" style="color: #fff!important;background-color: #b1c248;">更新</a><a href="/tag/前端/" title="前端" class="ren-summary-tag" style="color: #fff!important;background-color: #c4c23f;">前端</a><span class="date" style="float: right;">2024-11-29</span></div><div class="clearboth"></div></div><div class="articleList clearfix"><div class="intro"><a title="微软发布 Windows 11​​ 22621.1928 正式版更新(KB5027303),带来了多项新增内容和改进" href="/article/785201a64a.html"><h4>微软发布 Windows 11​​ 22621.1928 正式版更新(KB5027303),带来了多项新增内容和改进</h4></a><div class="des">微软今日面向 Windows 11 用户推送了 22621.1928 正式版更新(KB5027303),带来了多项新增内容和改进。</div></div><div class="articleBottom"><a href="/tag/Windows/" title="Windows" class="ren-summary-tag" style="color: #fff!important;background-color: #958ef2;">Windows</a><a href="/tag/11/" title="11" class="ren-summary-tag" style="color: #fff!important;background-color: #9961dd;">11</a><a href="/tag/微软/" title="微软" class="ren-summary-tag" style="color: #fff!important;background-color: #b1c248;">微软</a><span class="date" style="float: right;">2024-11-30</span></div><div class="clearboth"></div></div></div></div><div class="hotFlag"><h4>热门标签</h4><div class="flagBox"><a title="Linux" href="/tag/Linux/">Linux(148)</a><a title="PHP" href="/tag/PHP/">PHP(127)</a><a title="Java" href="/tag/Java/">Java(102)</a><a title="正则表达式" href="/tag/正则表达式/">正则表达式(101)</a><a title="JavaScript" href="/tag/JavaScript/">JavaScript(69)</a><a title="最佳实践" href="/tag/最佳实践/">最佳实践(67)</a><a title="jQuery" href="/tag/jQuery/">jQuery(44)</a><a title="MySQL" href="/tag/MySQL/">MySQL(39)</a><a title="Docker" href="/tag/Docker/">Docker(37)</a><a title="C语言" href="/tag/C语言/">C语言(36)</a><a title="性能优化" href="/tag/性能优化/">性能优化(34)</a><a title="Python" href="/tag/Python/">Python(34)</a><a title="XML" href="/tag/XML/">XML(28)</a><a title="string" href="/tag/string/">string(27)</a><a title="第三方库" href="/tag/第三方库/">第三方库(23)</a><a title="回调函数" href="/tag/回调函数/">回调函数(23)</a><a title="ZIP" href="/tag/ZIP/">ZIP(22)</a><a title="数组" href="/tag/数组/">数组(22)</a><a title="可扩展性" href="/tag/可扩展性/">可扩展性(22)</a><a title="字符串比较" href="/tag/字符串比较/">字符串比较(21)</a><a title="find" href="/tag/find/">find(20)</a><a title="RPM" href="/tag/RPM/">RPM(20)</a><a title="Go" href="/tag/Go/">Go(20)</a><a title="grep" href="/tag/grep/">grep(19)</a><a title="ASP.NETCore" href="/tag/ASP.NETCore/">ASP.NETCore(19)</a><a title="XML解析器" href="/tag/XML解析器/">XML解析器(19)</a><a title="事件" href="/tag/事件/">事件(19)</a><a title="事件处理程序" href="/tag/事件处理程序/">事件处理程序(19)</a><a title="StringBuilder" href="/tag/StringBuilder/">StringBuilder(18)</a><a title="Nginx" href="/tag/Nginx/">Nginx(18)</a></div></div></div><div class="main_right fr"><div class="artHotSearch"><h4 class="title"><div class="fl"><span class="icon bg_content bg_icon_rs"></span><span class="name">编程热搜</span></div><a href="" class="fr bg_content bg_txt_rsb"></a><div class="clearboth"></div></h4><ul><li class="rslist clearfix"><div class="rslist_left fl"><h5><span class="fl name"><a title="Python 学习之路 - Python" href="https://www.528045.com/article/52df4d95aa.html">Python 学习之路 - Python</a></span></h5><div class="clearboth"></div><div class="des">一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-</div></div><img class="lazy" data-type="0" data-src="/file/imgs/upload/202301/31/qglhspth11k.jpg" alt="Python 学习之路 - Python" /><div class="clearboth"></div></li><li class="rslist clearfix"><div class="rslist_left fl"><h5><span class="fl name"><a title="chatgpt的中文全称是什么" href="https://www.528045.com/article/6d32547808.html">chatgpt的中文全称是什么</a></span></h5><div class="clearboth"></div><div class="des">chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列</div></div><img class="lazy" data-type="0" data-src="https://static.528045.com/imgs/35.jpg?imageMogr2/format/webp/blur/1x0/quality/35" alt="chatgpt的中文全称是什么" /><div class="clearboth"></div></li><li class="rslist clearfix"><div class="rslist_left fl"><h5><span class="fl name"><a title="C/C++中extern函数使用详解" href="https://www.528045.com/article/9733fb00d0.html">C/C++中extern函数使用详解</a></span></h5><div class="clearboth"></div><div class="des"></div></div><img class="lazy" data-type="0" data-src="/file/upload/202211/13/d3kqhimmpgl.jpg" alt="C/C++中extern函数使用详解" /><div class="clearboth"></div></li><li class="rslist clearfix"><div class="rslist_left fl"><h5><span class="fl name"><a title="C/C++可变参数的使用" href="https://www.528045.com/article/773997944a.html">C/C++可变参数的使用</a></span></h5><div class="clearboth"></div><div class="des">可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃</div></div><img class="lazy" data-type="0" data-src="https://static.528045.com/imgs/37.jpg?imageMogr2/format/webp/blur/1x0/quality/35" alt="C/C++可变参数的使用" /><div class="clearboth"></div></li><li class="rslist clearfix"><div class="rslist_left fl"><h5><span class="fl name"><a title="css样式文件该放在哪里" href="https://www.528045.com/article/617e4312cb.html">css样式文件该放在哪里</a></span></h5><div class="clearboth"></div><div class="des"></div></div><img class="lazy" data-type="0" data-src="https://static.528045.com/imgs/51.jpg?imageMogr2/format/webp/blur/1x0/quality/35" alt="css样式文件该放在哪里" /><div class="clearboth"></div></li><li class="rslist clearfix"><div class="rslist_left fl"><h5><span class="fl name"><a title="php中数组下标必须是连续的吗" href="https://www.528045.com/article/21ee165f7c.html">php中数组下标必须是连续的吗</a></span></h5><div class="clearboth"></div><div class="des"></div></div><img class="lazy" data-type="0" data-src="/upload/jz5euwde0tq.jpg" alt="php中数组下标必须是连续的吗" /><div class="clearboth"></div></li><li class="rslist clearfix"><div class="rslist_left fl"><h5><span class="fl name"><a title="Python 3 教程" href="https://www.528045.com/article/01a1d65257.html">Python 3 教程</a></span></h5><div class="clearboth"></div><div class="des">Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python</div></div><img class="lazy" data-type="0" data-src="/upload/202205/01/jneowzxxjtt.jpg" alt="Python 3 教程" /><div class="clearboth"></div></li><li class="rslist clearfix"><div class="rslist_left fl"><h5><span class="fl name"><a title="Python pip包管理" href="https://www.528045.com/article/ab7f357e04.html">Python pip包管理</a></span></h5><div class="clearboth"></div><div class="des">一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    </div></div><img class="lazy" data-type="0" data-src="/file/imgs/upload/202301/31/qn4pmgvm0lq.jpg" alt="Python pip包管理" /><div class="clearboth"></div></li><li class="rslist clearfix"><div class="rslist_left fl"><h5><span class="fl name"><a title="ubuntu如何重新编译内核" href="https://www.528045.com/article/a65a3a171f.html">ubuntu如何重新编译内核</a></span></h5><div class="clearboth"></div><div class="des"></div></div><img class="lazy" data-type="0" data-src="/file/uploads/202210/26/1sph0pw5wqc.jpg" alt="ubuntu如何重新编译内核" /><div class="clearboth"></div></li><li class="rslist clearfix"><div class="rslist_left fl"><h5><span class="fl name"><a title="改善Java代码之慎用java动态编译" href="https://www.528045.com/article/d085d3bcbe.html">改善Java代码之慎用java动态编译</a></span></h5><div class="clearboth"></div><div class="des"></div></div><img class="lazy" data-type="0" data-src="https://static.528045.com/imgs/54.jpg?imageMogr2/format/webp/blur/1x0/quality/35" alt="改善Java代码之慎用java动态编译" /><div class="clearboth"></div></li></ul><div class="seeMore"><a href="https://www.528045.com/article/program-c4-1.html">查看更多</a></div></div><div class="artSubmit"><h4 class="title"><div class="fl"><span class="icon bg_content bg_icon_yktg"></span><span class="name">编程资源站</span></div><div class="clearboth"></div></h4><ul class="submitNav clearfix"><li class="active first">资料下载</li><li>历年试题</li></ul><div class="submitBox active"><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="2021年下半年软考高级信息系统项目管理师高频考点" href="https://www.528045.com/down/89bb6.html">2021年下半年软考高级信息系统项目管理师高频考点</a><span class="hot"><a href="https://www.528045.com/down/ziliao-c69-1.html">精选资料</a></span></h5></div><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="2021下半年软考高级信息系统技术知识点记忆口诀" href="https://www.528045.com/down/7d690.html">2021下半年软考高级信息系统技术知识点记忆口诀</a><span class="hot"><a href="https://www.528045.com/down/ziliao-c69-1.html">精选资料</a></span></h5></div><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="2021下半年软考《信息系统项目管理师》考试真题及答案" href="https://www.528045.com/down/4277a.html">2021下半年软考《信息系统项目管理师》考试真题及答案</a><span class="hot"><a href="https://www.528045.com/down/ziliao-c69-1.html">精选资料</a></span></h5></div><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="2021下半年软考高级考试备考攻略" href="https://www.528045.com/down/9248a.html">2021下半年软考高级考试备考攻略</a><span class="hot"><a href="https://www.528045.com/down/ziliao-c69-1.html">精选资料</a></span></h5></div><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="2021年软考高级《信息系统项目管理师》巩固练习题汇总" href="https://www.528045.com/down/fcca0.html">2021年软考高级《信息系统项目管理师》巩固练习题汇总</a><span class="hot"><a href="https://www.528045.com/down/ziliao-c69-1.html">精选资料</a></span></h5></div><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="2021下半年软考高级信息系统项目管理师30个易考知识点汇总" href="https://www.528045.com/down/7636b.html">2021下半年软考高级信息系统项目管理师30个易考知识点汇总</a><span class="hot"><a href="https://www.528045.com/down/ziliao-c69-1.html">精选资料</a></span></h5></div><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="2021下半年软考高级知识点这样记,还担心记不住吗" href="https://www.528045.com/down/76382.html">2021下半年软考高级知识点这样记,还担心记不住吗</a><span class="hot"><a href="https://www.528045.com/down/ziliao-c69-1.html">精选资料</a></span></h5></div><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="2021年下半年软考高级考试重点汇总" href="https://www.528045.com/down/15f44.html">2021年下半年软考高级考试重点汇总</a><span class="hot"><a href="https://www.528045.com/down/ziliao-c69-1.html">精选资料</a></span></h5></div><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="2021下半年软考高级信息系统项目管理师计算公式汇总" href="https://www.528045.com/down/2d560.html">2021下半年软考高级信息系统项目管理师计算公式汇总</a><span class="hot"><a href="https://www.528045.com/down/ziliao-c69-1.html">精选资料</a></span></h5></div><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="2021年下半年软考高级《信息系统项目管理师》模拟试题" href="https://www.528045.com/down/c0085.html">2021年下半年软考高级《信息系统项目管理师》模拟试题</a><span class="hot"><a href="https://www.528045.com/down/ziliao-c69-1.html">精选资料</a></span></h5></div><div class="seeMore"><a href="/down/">查看更多</a></div></div><div class="submitBox"><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="信息系统项目管理师选择题每日一练(2024)" href="https://www.528045.com/article/6d5f303202.html">信息系统项目管理师选择题每日一练(2024)</a><span class="hot"><a href="https://www.528045.com/article/lnst-c57-1.html">历年试题</a></span></h5></div><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="2023年下半年信息系统项目管理师综合知识真题演练" href="https://www.528045.com/article/f2da969d4f.html">2023年下半年信息系统项目管理师综合知识真题演练</a><span class="hot"><a href="https://www.528045.com/article/lnst-c57-1.html">历年试题</a></span></h5></div><div class="seeMore"><a href="https://www.528045.com/article/lnst-c57-1.html">查看更多</a></div></div></div><div class="meumfie"><h4 class="title"><div class="fl"><span class="icon bg_content bg_icon_ykzl"></span><span class="name">目录</span></div><div class="clearboth"></div></h4><div class="toc"></div></div></div><div class="clearboth"></div></div><script type="text/javascript" src="/skin/static/js/toc.js"></script><div class="popUp popDelay"><div class="maskBg"></div><div class="popCon"><span class="btn btn_close"></span><div class="tip"> 本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页 </div><div class="delayMain"><div class="delaymain_left"><a href="https://www.528045.com"><img src="https://static.528045.com/skin/content_left.png?imageMogr2/format/webp/blur/1x0/quality/35"></a></div><div class="delaymain_right"><div class="news_title"><span class="fl">最新资讯</span ><a href="/" class="fr">更多</a><div class="clearboth"></div></div><ul></ul></div><div class="clearboth"></div></div><div class="bigshow"><a href="https://www.528045.com"><img src="https://static.528045.com/skin/content_bottom.png?imageMogr2/format/webp/blur/1x0/quality/35"></a></div></div></div><div class="footer"><div class="friendLink"><span class="friendTitle">友情链接</span><a href="https://www.lsjlt.com">编程网</a></div><script type="text/javascript" src="/skin/static/js/footermain.js"></script></div><div class="popCommon"><span class="mask"></span><div class="popCon"></div></div><div class="ajaxrightbtn"><div class="funBtnbox"><div class="rb_fk rb_ty br_bom"><div class="wx_mo1 _mo1"><i class="dtmuban-iconfont icon-fankui2"></i><p>反馈</p></div><a href="javascript:void(0);" onclick="Dsb('urs-form-modalfk');"><div class="_mo2 rb_gradient br_bom"><p>我要<br>反馈</p></div></a></div></div><div class="fbs fbs-gotp back2top" style="display: none;"><div class="rb_top rb_ty br_all"><div class="top_mo1 _mo1 "><i class="dtmuban-iconfont icon-zhiding"></i></div><a href="javascript:void(0);" title="返回顶部"><div class="_mo2 rb_gradient br_all"><p>返回<br>顶部</p></div></a></div></div></div><div id="urs-form-modalfk-bg" class="urs-form-modal-bg" style="display: none;"></div><div id="urs-form-modalfk" class="urs-form-modal" style="display: none;"><div class="urs-form-component plan-get-form-mini js-apply-form clearfix"><div class="urs-component-head"><div class="icon-close" onclick="Dhb('urs-form-modalfk');"><img id="close-btn" src="https://static.528045.com/skin/ic_delete_normal_24px.png"></div><p class="form-title">留言反馈</p><p></p><p class="form-line"></p></div><div class="urs-component-tab"><h5>感谢您的提交,我们服务专员将在<span>30分钟内</span>给您回复</h5><div class="get-plan-form-item"><i class="u-item-icon dtmuban-iconfont icon-fanganguihua"></i><input class="u-input js-apply-phone" type="text" id="titleb" name="titleb" value="我要反馈留言,看到请回复" placeholder="留言标题"><span id="dtitlea"></span></div><div class="get-plan-form-item"><select name="typeidb" id="typeidb" class="u-select"><option value="">请选择类型</option><option value="0">问题反馈</option><option value="1">意见建议</option><option value="2">倒卖举报</option><option value="3">不良信息</option><option value="4">其他</option></select></div><div class="get-plan-form-item"><i class="u-item-icon dtmuban-iconfont icon-yonghu"></i><input class="u-input js-apply-name" type="text" id="truenameb" name="truenameb" placeholder="您的姓名" value=""><span id="dtruenameb"></span></div><div class="get-plan-form-item"><i class="u-item-icon dtmuban-iconfont icon-liuyan"></i><input class="u-input js-apply-phone" type="text" id="emailb" name="emailb" placeholder="您的邮箱" value=""><span id="demailb"></span></div><div class="get-plan-form-item"><i class="u-item-icon dtmuban-iconfont icon-shouji"></i><input class="u-input js-apply-phone" type="text" id="telephoneb" name="telephoneb" placeholder="您的手机" value=""><span id="dtelephoneb"></span></div><div class="get-plan-form-item"><i class="u-item-icon dtmuban-iconfont icon-liuyan2"></i><textarea class="u-textarea js-apply-content" id="contentb" name="contentb" placeholder="留言说明,文字为2-100字" value=""></textarea><span id="dcontentb"></span></div><button type="submit" name="submit" class="btn btn-red" onclick="checkaguestbook();">立即提交</button></div></div></div><style> .drop_more li{ list-style: none;} </style><script type="text/javascript" src="/file/script/config.js"></script><script type="text/javascript" src="/file/script/common.js"></script><script type="text/javascript" src="/skin/static/js/commonpop.js"></script><script type="text/javascript" src="/skin/static/js/header.js"></script><script type="text/javascript" src="/skin/static/js/footer.js"></script><script type="text/javascript" src="/skin/static/js/listconcommon.js"></script><script src="/skin/static/layui/layui.js" type="text/javascript"></script><script src="/skin/static/js/custom-script.js" type="text/javascript"></script><script src="/skin/static/js/indexsms.js?v=20240108.1443"></script><script type="text/javascript"> $(function(){ var destoon_userid = 0,destoon_username = '',destoon_member = destoon_guest = ''; destoon_guest = '<div class="login-li"><a href="javascript:void(0);" lay-on="showLoginPopup" class="a_on_dl" id="dn-login">请登录</a></div><div class="login-li"><a href="javascript:void(0);" lay-on="showLoginPopup" class="a_to">免费注册</a></div>'; destoon_member += destoon_guest; $('#m52_member').html(destoon_member); }); </script></body></html><script type="text/javascript" src="/skin/static/js/contentie.js"></script>