javascript - React 中的 props 不应该被更改/突变的原因是因为 React 希望元素尽可能可预测吗?

标签 javascript html reactjs attributes react-props

来自 React 文档。

Conceptually, components are like JavaScript functions. They accept arbitrary inputs (called “props”) and return React elements describing what should appear on the screen.

考虑:

function Welcome(props) {   
  return <h1>Hello, {props.name}</h1>; 
}

class Welcome extends React.Component {
  render() {
    return <h1>Hello, {this.props.name}</h1>;
  }
}

将使我们能够做到这一点:

<Welcome name="Luke" />;
<Welcome name="Leia" />;

在 DOM 中按照我们的意愿使用,

你好,卢克

你好,莱娅

现在当人们规定不应更改 props 时,这是有道理的,原因是在我看来这与更改图像标签的属性值一样吗?

HTML:

<img id="Executor" alt="Picture of Executor" src="/somepath/vaders-star-destroyer-executor.jpg"/>

JS:

与此同时,很久以前在一个遥远的星系中的 Javascript 文件中......

var imageOfVadersStarDestroyer = document.getElementById('Executor');

imageOfVadersStarDestroyer.src = "/somepath/vaders-star-destroyer-avenger.jpg"

因为如果我们不断更改元素属性值,这会导致困惑和渲染速度变慢?

那么 React 中规定永远不要更改 props 的原因是因为库正在尝试使元素尽可能可预测吗?

最佳答案

在 React 之外设置 props 是危险的,应该避免。为什么?主要原因是它不会触发重新渲染。因此会出现错误和意外行为。

重新渲染

大多数时候,props 是在父组件中作为状态存储的数据,通过调用 setState()(或 React.useState( ))。一旦 setState() 被调用,React 就会重新渲染并计算引擎盖下发生的变化,以及最新的 props 和状态。手动为 props 赋值,因此不会通知 React 数据已更改并且必须重新渲染某些内容。

最佳实践

将 props 设置为只读允许 React 组件尽可能纯净,这显然是一个很好的做法,即使在编写纯 JS 时也是如此。数据不会意外更改,只能通过调用 setState() 来完成(您可能听说过 single source of truth,这正是 React 正在尝试的杠杆)。

想象一下,您注意到应用程序出现问题并且显示给最终用户的数据与源数据完全不同,试图找出数据在哪里被操纵会很痛苦,不是吗? :)

关于javascript - React 中的 props 不应该被更改/突变的原因是因为 React 希望元素尽可能可预测吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57660115/

相关文章:

reactjs - 如何在 Deck.gl 的 IconLayer 中渲染自定义 svg

c# - MIME 多部分流意外结束。 MIME 多部分消息不完整。 Web API 和 super 代理

html - 我在带显示的媒体查询中显示一个 div 吗?

javascript - 在基于 Web 的应用程序中,在何处正确且安全地存储 JWT token ?

javascript - 我想在页面加载时将默认文本加载到文本区域中

javascript - 根据另一个数组修改一个数组

javascript - 用 HTML 制作一个简单的终端

javascript - 根据我的 Bootstrap 轮播的位置设置文本

javascript - 内联样式和 ReactCSSTransitionGroup

javascript - 我的 li 范围没有在 Angular js 中删除为什么?