问答

React 出现Cannot add property zIndex, object is not extensib

作者:admin 2021-05-09 我要评论

为什么在render中使用变量,会却出现了对象不可扩展。 首先,定义变量。(以下步骤全在class内部执行) boxOpenStyle={}; 然后,在方法open中去增加一个属性。 o...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

为什么在render中使用变量,会却出现了对象不可扩展。

首先,定义变量。(以下步骤全在class内部执行)

boxOpenStyle={};

然后,在方法open中去增加一个属性。

open(){
    this.boxOpenStyle.zIndex=9;
    this.setState({visible:true});
}

在方法close中对该变量重新赋值。

close(){
    this.boxOpenStyle.zIndex=8;
    this.setState({visible:false});
}

最后,render中使用该变量。

render(){
    return (
        <div style={this.state.visible ? this.boxOpenStyle:{}}></div>
    );
}

最后出现结果是:

   1.当执行open方法时,程序正常运行。
   2.当close方法被执行时,程序出错,告知对象只读,不可重新赋值。

如下图:
image.png

就算将boxOpenStyle放在state里面去改变,仍然会出现这样的错误。
但是如果将style变成id或className:

<div id={this.state.visible ? this.boxOpenStyle:{}}></div>
或
<div className={this.state.visible ? this.boxOpenStyle:{}}></div>

就不会出现这样的错误。
所以,请问这是react的什么机制触发了只读和不可扩展属性?

###

为了避免一些错误,react内部冻结了元素的很多内容,意思就是让你尽量使用setState来更改数据。

执行open方法时,boxOpenStyle还没冻结,close的时候元素创建完成,对象已经被冻结,再更改属性抛出错误

image.png

###

原因:
React除了不建议props对象作为可修改对象外,还不建议把传给style属性的对象作为可修改对象。并且从React 16开始也传给style属性的对象冻结了(Object.freeze

if (propKey === STYLE) {
      if (__DEV__) {
        if (nextProp) {
          // Freeze the next style object so that we can assume it won't be
          // mutated. We have already warned for this in the past.
          Object.freeze(nextProp);
        }
      }

你的代码又是在严格模式下执行的,所以当close方法被执行时就抛TypeError异常了。

解决方案之一:

render(){
    return (
        <div style={{...(this.state.visible ? this.boxOpenStyle:{})}}></div>
    );
}

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • app内的web页面,img路径对,但是不显

    app内的web页面,img路径对,但是不显

  • 如何做下载功能?

    如何做下载功能?

  • 复杂正则表达式,实现思路

    复杂正则表达式,实现思路

  • vue一段简单的代码出现奇怪的问题?

    vue一段简单的代码出现奇怪的问题?

腾讯云代理商
海外云服务器