gpt4 book ai didi

reactjs - React - 您可以从外部函数更新未声明的容器状态吗?

转载 作者:行者123 更新时间:2023-12-03 14:07:28 24 4
gpt4 key购买 nike

在 Unstated 库的示例中,它们通过与订阅容器的 jsx 按钮交互来更新容器内的状态。

import React from 'react';
import { render } from 'react-dom';
import { Provider, Subscribe, Container } from 'unstated';

type CounterState = {
count: number
};

class CounterContainer extends Container<CounterState> {
state = {
count: 0
};

increment() {
this.setState({ count: this.state.count + 1 });
}

decrement() {
this.setState({ count: this.state.count - 1 });
}
}

function Counter() {
return (
<Subscribe to={[CounterContainer]}>
{counter => (
<div>
<button onClick={() => counter.decrement()}>-</button>
<span>{counter.state.count}</span>
<button onClick={() => counter.increment()}>+</button>
</div>
)}
</Subscribe>
);
}

render(
<Provider>
<Counter />
</Provider>,
document.getElementById('root')
);

有没有办法从容器外部组件中的函数更新容器内的状态?因此,例如,如果我想在 promise 返回期间更新状态,我将如何去做。伪代码

login = () => {
let url = baseURL + '/user/login?_format=json';

let data = {
"name": this.state.email,
"pass": this.state.password
};



axios({
url,
method: "POST",
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
withCredentials: true,
credentials: 'same-origin',
data,
})
.then(function(result) {
console.log('result:', result);
SET STATE HERE!!!!!!!
counter.increment()

})
.catch(error => console.log('error:', error));
};

最佳答案

问题并不特定于 Unstated,这也适用于使用 render prop 模式的 React context API。

login 的问题在于其控制流程存在缺陷。它无法有效地捕获错误,因为它会抑制错误。它封装了内部的 promise ,对于初学者来说,这是一个阻止其正确测试的错误

它可以公开 promise ,或接受回调,或两者兼而有之:

login = async (cb) => {
...
return axios(...)
.then(function(result) {
if (cb)
cb(result);

return result;
})
.catch(error => console.log('error:', error));
}

可用作:

<button onClick={() => login(() => counter.decrement())}>-</button>

或者:

<button onClick={async () => { await login(); counter.decrement(); }}>-</button>

也可以让 login 接受 counter 作为参数,但这会将其耦合到不必要的实现。

关于reactjs - React - 您可以从外部函数更新未声明的容器状态吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52284967/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com