首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >突变反应状态删除类方法

突变反应状态删除类方法
EN

Stack Overflow用户
提问于 2022-08-11 17:52:17
回答 2查看 46关注 0票数 0

我有一个处于反应性状态的类实例,如下所示:

代码语言:javascript
复制
class Room {
  name;
  participant;
  constructor(name) {
    this.name = name;
    this.participant = {
      screensharing: false,
    };
  }
  sendReinvite() {
    console.log("reinvite");
  }
}

更改屏幕共享并使用扩展运算符进行状态变异后,sendReinvite方法将被删除,并在第二次单击时导致错误:

代码语言:javascript
复制
const SpreadOperator = () => {
  const [room, changeRoom] = useState(new Room());

  const toggleScreenSharing = () => {
    console.log("room", room);
    room.participant.screensharing = !room.participant.screensharing;
    room.sendReinvite();
    changeRoom({...room});
  };
  return (
    <div>
      <h1>spread operator</h1>
      <button onClick={toggleScreenSharing}>Screen share</button>
    </div>
  );
};
export default SpreadOperator;

错误: Uncaught : room.sendReinvite不是一个函数--如何在不丢失方法的情况下更改屏幕共享,顺便说一句,这个实例来自某个库,我无法更改它,

就像一个真实的:

房间

EN

回答 2

Stack Overflow用户

发布于 2022-08-11 18:22:01

不要在类实例中使用扩散运算符。

检查此链接以查看为什么我不能在类函数上使用扩展运算符?

考虑以下片段:

代码语言:javascript
复制
class A {
  constructor() {
    this.a = 'a', this.b = 'b'
  }
  mymethod() { 
    return true 
  }
}

如果你这样做了:

代码语言:javascript
复制
const a = new A();
a.mymethod(); // true

如果你在里面使用扩展操作符:

代码语言:javascript
复制
const a = new A();
const b = { ...a };
b.mymethod(); // b.mymethod is not a function
b.a; // 'a'

不要直接修改您的状态

再说一遍,为什么我不能直接修改组件的状态呢?

你这样做是因为:

代码语言:javascript
复制
room.participant.screensharing = !room.participant.screensharing;

因此,替换:

代码语言:javascript
复制
room.participant.screensharing = !room.participant.screensharing;
room.sendReinvite();
changeRoom({...room});

通过以下方式:

代码语言:javascript
复制
const myNewRoomState = new Room(); // Create another state object
myNewRoomState.participant.screensharing = !room.participant.screensharing;
myNewRoomState.sendReinvite();
changeRoom(myNewRoomState);

这仍然值得怀疑,因为您正在使用可变类实例来存储不可变状态,我建议您检查这个帖子:是否有一种将可变类实例对象存储在状态中的反应方式?

但总括而言:

  • 避免类实例中的扩展运算符。
  • 不要直接修改您的状态,通过changeRoom函数(它是负责更改您的房间状态的函数)更改它的属性。
票数 1
EN

Stack Overflow用户

发布于 2022-08-11 18:24:34

亚历克斯在回答这个问题上做得很好,但我想补充一些东西来帮助你更好地理解。

sendReinvite存在于Room.prototype中,而做{...rom}并不能克隆原型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73324952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档