region-core icon indicating copy to clipboard operation
region-core copied to clipboard

fix createRegion reset

Open cloudmoonocus opened this issue 2 years ago • 1 comments

对于一些场景,没有使用createMappedRegion。 在使用createRegion的时候,如果使用下面这个方式修改数据:

region.set(prevValue => {
    prevValue.xxx = 'xxxx';
    return prevValue;
});

当 region 中没有数据的时候,就会将initialValue赋值给prevValue,这样会导致initialValue被修改,reset的时候就会出问题。

cloudmoonocus avatar Jan 19 '24 05:01 cloudmoonocus

只要初始值是引用类型,就会出现这种问题,测试用例没加上这个:

test('reset array', async () => {
    const region = createRegion<string[]>([]);
    const {set, reset, getValue} = region;

    set(prevValue => {
        prevValue.push('testValue');
        return prevValue;
    });

    expect(getValue()).toStrictEqual(['testValue']);

    reset();

    expect(getValue()).toStrictEqual([]);
});

cloudmoonocus avatar Jan 19 '24 05:01 cloudmoonocus

暂时不认为这是一个 bug。

就像是如果使用 mutable 的方式使用 react,很多时候也会产生问题,region-core 本身就是一个 react 下的状态管理方案,本身就不希望用户以 mutable 的方式来使用。

这是一个可解释的行为,当然 copy 一份也是一个可解释的行为,这两个我都能接受。

那么,最终我决定还是不引入一个库(以及额外的计算逻辑)来解决这个问题(因为它不是问题,而是可解释的某种行为)。

所以,就像在 useState 中的一样,你应该总是使用 [...state, value] 来代替 state.push(value)

同样的,就像这个操作在 react 中引起问题一样,这个操作在 region-core 也不被鼓励。


顺便一提,引用不变的写法,即使通过了 region-core,估计还是会有问题,react 那边说不定会产生问题的。

dancerphil avatar Mar 21 '24 13:03 dancerphil

暂时不认为这是一个 bug。

就像是如果使用 mutable 的方式使用 react,很多时候也会产生问题,region-core 本身就是一个 react 下的状态管理方案,本身就不希望用户以 mutable 的方式来使用。

这是一个可解释的行为,当然 copy 一份也是一个可解释的行为,这两个我都能接受。

那么,最终我决定还是不引入一个库(以及额外的计算逻辑)来解决这个问题(因为它不是问题,而是可解释的某种行为)。

所以,就像在 useState 中的一样,你应该总是使用 [...state, value] 来代替 state.push(value)

同样的,就像这个操作在 react 中引起问题一样,这个操作在 region-core 也不被鼓励。

顺便一提,引用不变的写法,即使通过了 region-core,估计还是会有问题,react 那边说不定会产生问题的。

get!

cloudmoonocus avatar Mar 22 '24 05:03 cloudmoonocus