Giter Site home page Giter Site logo

Comments (5)

github-actions avatar github-actions commented on May 22, 2024

由于缺乏足够的信息,我们暂时关闭了该 Issue。请修改(不要回复) Issue 提供最小重现以重新开启。谢谢。

from umi.

Baoyx007 avatar Baoyx007 commented on May 22, 2024

只要接口返回的 json 是直接当成 model 返回时, 非常容易复现

from umi.

fz6m avatar fz6m commented on May 22, 2024

在你的 demo 复现里,这段代码:

  let a = Object.create({}, { a: Math.random() });
  let b = Object.create({}, { b: Math.random() });
  a.b = b;

在浏览器控制台运行了一下,会直接报错的,这是一段错误的代码。

只要接口返回的 json 是直接当成 model 返回时, 非常容易复现

如有问题,需要给一个最小复现。

from umi.

Baoyx007 avatar Baoyx007 commented on May 22, 2024

不好意思, 搞错了. 已更新例子

问题应该就 useModel() 方法的第二个参数. 在第二次渲染的时候, 会对新旧 2 个对象调用下面这个 isEqual 方法, 而 isEqual 又会调用 valueOf 方法导致报错.

if (!isEqual(currentState, previousState)) {

from umi.

fz6m avatar fz6m commented on May 22, 2024

你新给的 codesandbox 例子里,这段代码:

  const { a } = useModel('index', ({ a }) => {
    a;
  });

是没有返回值的,在 js 里返回值必须使用 return { a } ,如果要省略 return ,对于 object 类型的需要添加括号,比如 () => ({ a }) / () => 1 / () => [] ,更多方式请自行查找学习。

如果改成 return { a } 就可以正常运行了。

至于你提到的 valueOf 问题:

在各种 react 全局状态管理方案里,use model 这个方案是属于使用原生 context 的原生方案,比较轻量,但 context 中的数据只要有任何值更新了,整个 context 下面的内容都会重渲染,这里 use model 在每次数据更新时使用 equal 对比方法来避免一部分重渲染的问题,所以就需要你的对象拥有能对比值的实现。

Object.create 是创建纯对象的方法,不是一般的对象,创建一个对象应该使用 {} ,纯对象一般用于需要自行实现原生方法避免冲突(如 toString)或特殊不需要继承方法的安全场景,99% 的情况你并不需要纯对象,所以当你有需求需要使用纯对象时,应该自行实现各种你需要的继承方法,如果你需要使用 use model ,就需要最少实现 valueOf ,但我并不确定在 react 、use model 、其他的三方库代码中是否还会使用其他继承方法,所以如果你需要使用纯对象,为了避免在应用中传递、使用时出现问题,所有可能需要的方法都应该自己实现。

from umi.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.