简体   繁体   English

组件第一次渲染后,对象变为只读

[英]Object becomes read-only after the component rendered first time

The issue occurs when I try to upgrade React 15.X to React 16.X:当我尝试将 React 15.X 升级到 React 16.X 时会出现问题:

let style = {
  width:12
};
class Box extends React.Component {
  constructor(props) {
    super(props);
  }
  render() {

    console.log(Object.getOwnPropertyDescriptor(style,'width'))

    style.width = 96;

    return (
      <div style={style}>

      </div>
    );
  }
}

outputs:输出:

  • {value: 12, writable: true , enumerable: true, configurable: true} {值:12,可写:,可枚举:真,可配置:真}
  • {value: 12, writable: false , enumerable: true, configurable: false} {值:12,可写:,可枚举:真,可配置:假}
  • {value: 12, writable: false, enumerable: true, configurable: false} {值:12,可写:假,可枚举:真,可配置:假}

Anyone knows why the 'writable' becomes false?任何人都知道为什么“可写”会变成假?

Because mutating the style object is forbidden, and somewhere in the rendering process, Object.freeze(style) is called.因为改变style对象是被禁止的,并且在渲染过程的某个地方, Object.freeze(style)被调用。

Ref:参考:

Object mutation in React has long been discouraged.长期以来,React 中的对象突变一直不被鼓励。 Object.freeze(props) is enforced back in v0.xx days. Object.freeze(props)在 v0.xx 天后被强制执行。 In v16 Object.freeze(style) is added.在 v16 中添加了Object.freeze(style)

Try use 尝试使用

<div style={this.style}>

For me its working after using this 对我来说使用它后的工作

Update 更新资料

If I'm not wrong you want to effect your style after dynamically change, in this case you have to use state, Here is my idea 如果我没看错,您想在动态更改后影响样式,在这种情况下,您必须使用状态,这是我的想法

You have to declare state for your style like this 您必须像这样声明自己的风格状态

class Box extends React.Component {      
    state = {
        style: {
          width: 12
        }
    }

Here is my render 这是我的render

render() {
    console.log(Object.getOwnPropertyDescriptor(this.state.style, "width"));

    return (
      <div style={this.state.style}>
        <button onClick={this.handleChangeStyle}>Change Style</button>
      </div>
    );
  }

And here is my handle method 这是我的处理方法

handleChangeStyle = () => {
    let style = { ...this.state.style };
    style.width += 1;
    this.setState({ style });
  };

为什么yelded object '#<object> ' 只读?<div id="text_translate"><p> 我使用 yield 实现了一个简单的搜索 - 通过递归文件夹结构运行,产生所有文件夹。 我的实现相当简单,我删除了所有“const”(以防万一)</p><pre> function *folders(f: Folder): IterableIterator&lt;Folder&gt; { yield f; if (f.folders) { for (let sf of f.folders) { yield* folders(sf); } } } function *allFolders(): IterableIterator&lt;Folder&gt; { for (let p of projects) { yield* folders(p.project.rootFolder!) } }</pre><p> 当我尝试修改返回的 object</p><pre> let folders = allFolders(); let t = folders.next().value; t.name = "sdvs";</pre><p> 我明白了</p><pre>TypeError: Cannot assign to read only property 'name' of object '#&lt;Object&gt;'</pre><p> 如果我直接访问 object (它位于此文件中的全局 scope 中)就可以了。 我现在已经花了几个小时在这上面,我完全感到困惑。 这根本不可能吗? 为什么会发生这种情况?</p></div></object> - Why is yelded object '#<Object>' read-only?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 对象只读属性 - Object Read-Only Properties 为什么yelded object '#<object> ' 只读?<div id="text_translate"><p> 我使用 yield 实现了一个简单的搜索 - 通过递归文件夹结构运行,产生所有文件夹。 我的实现相当简单,我删除了所有“const”(以防万一)</p><pre> function *folders(f: Folder): IterableIterator&lt;Folder&gt; { yield f; if (f.folders) { for (let sf of f.folders) { yield* folders(sf); } } } function *allFolders(): IterableIterator&lt;Folder&gt; { for (let p of projects) { yield* folders(p.project.rootFolder!) } }</pre><p> 当我尝试修改返回的 object</p><pre> let folders = allFolders(); let t = folders.next().value; t.name = "sdvs";</pre><p> 我明白了</p><pre>TypeError: Cannot assign to read only property 'name' of object '#&lt;Object&gt;'</pre><p> 如果我直接访问 object (它位于此文件中的全局 scope 中)就可以了。 我现在已经花了几个小时在这上面,我完全感到困惑。 这根本不可能吗? 为什么会发生这种情况?</p></div></object> - Why is yelded object '#<Object>' read-only? 无法分配给 object 的只读属性 - cannot assign to read-only property of object Firebase身份验证 - 只有在首次成功注册后,用户对象才会变为空 - Firebase Authentication - User object becomes null only after first successful signup “主屏幕”是只读的 - "HomeScreen" is read-only 只读属性 - read-only property 隐藏div中的tinyMCE仅在第一次更新并变为只读 - tinyMCE inside hidden div updates only first time and becomes readonly 输入数据后将表单输入字段转换为只读 - Transform form Input field into read-only after data is entered 可以在JavaScript中创建对对象外部代码只读的属性吗? - Can properties that are read-only to code outside of an object be created in JavaScript? 使只读的对象包装器变得简单 - Making a read-only Object wrapper fool proof
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM