【问题标题】:Why does my localStorage.setItem not seem to be doing anything?为什么我的 localStorage.setItem 似乎没有做任何事情?
【发布时间】:2019-02-02 07:09:15
【问题描述】:

我已尝试将代码简化为相关的内容。

class AnnotatedLayout extends React.Component {
    state = {
        user: '',
        enabled: false,
    };

    render() {
        const { user, enabled } = this.state;
        const contentStatus = enabled ? 'Disable' : 'Enable';
        const textStatus = enabled ? 'enabled' : 'disabled';

        return (
            ...
                            <Form onSubmit={this.handleSubmit}>
                                <FormLayout>
                                    <TextField
                                        value={user}
                                        onChange={this.handleChange('user')}
                                        label="Shop Name"
                                        type="user"
                                        helpText={
                                            <span>
                                                Log in with your store username.
                                            </span>
                                        }
                                    />
                                    <Stack distribution="trailing">
                                        <Button primary submit>
                                            Submit
                                        </Button>
                                    </Stack>
                                </FormLayout>
                            </Form>
                        ...
        );
    }
    handleSubmit = () => {
        this.setState({
            user: this.state.user
        });
        localStorage.setItem('user', JSON.stringify(this.state.user));
        console.log('submission', this.state);
        console.log(this.state.user);
    };
    handleChange = field => {
        return value => this.setState({ [field]: value });
    };
}

export default AnnotatedLayout;

基本上,我的网页有一个表单组件,在提交时,它正在执行 this.handleSubmit,该函数位于底部。

我的代码应该做的是使用键“user”将提交的字符串保存到 localStorage,但显然(您可以在下面的 console.log 输出中看到)这并没有发生。

知道发生了什么吗?

我的网站在本地托管,通过隧道连接到 URL,并用作 shopify 嵌入式应用的基本 URL,只是为了提供所有相关上下文。

更新

handleSubmit = () => {
    this.setState({
        user: this.state.user
    },
        () => localStorage.setItem('user', "SMH"),
        console.log(localStorage.getItem('user'))
        );
    console.log('submission', this.state);
};

检查一下,提交我的文本表单后,这就是我得到的

localStorage 是不是类似于 local 或其他东西,以至于它不保存函数之外的任何内容??

【问题讨论】:

  • this.setState({ user: this.state.user }) ...什么,为什么?
  • 您是否尝试过从localStorage.setItem("user", JSON.stringify(this.state.user)) 中删除JSON.stringify?已经是字符串了……
  • 我现在正在关注一个教程,这就是他们所拥有的。 @user633183
  • 你会发布 `this.handleChange 的代码吗?
  • @JackBashford,我也试过了,因为它不起作用,所以我用 JSON.stringify 尝试了它,但我只是在没有 stringify 的情况下运行它,结果相同,null ://

标签: javascript reactjs local-storage


【解决方案1】:

handleChange 好像返回了一个方法,您需要再次调用该方法来设置用户值。

代替

<TextField
   value={user}
   onChange={this.handleChange('user')}
...

试试

<TextField
   value={user}
   onChange={e => this.handleChange('user')(e)}
...

handleChange 中的value 应该接受e 事件值,这是要设置的用户值。

【讨论】:

  • 不会是e.target.value 什么的吧?猜猜这取决于onChangeTextField 返回什么。另一方面,OP 注销了this.state.user,所以handleChange 必须工作?
  • 好的,我明白你想说什么,文本字段的更改应该已经足够了,我已经尝试过了,但没有成功:/
  • @putvande 是的。 e.target.value 需要转换为 user 对象。但是代码似乎没有那一步...?
  • @ark0n 我稍后会关闭这个问题,以防你以后需要它。 ?
【解决方案2】:
this.setState(
  {
    user: this.state.user
  },
  () => localStorage.setItem('user', JSON.stringify(this.state.user))
);

【讨论】:

  • 我试过了,getItem 仍然返回 null,有和没有 json.stringify fwiw
  • @ark0n 这是对的。你似乎不明白状态在 React 组件中是如何工作的。首先,您只是将user 的状态设置回其当前状态,因此不会发生任何变化。更重要的是,setState 不会立即更改组件上的this.state。它触发了一个新的渲染周期,因此更新后的状态将在componentWillUpdate 中提供(注意这很快就会被弃用)。但是,您可以添加在状态更新后始终执行的额外回调函数。 reactjs.org/docs/…
猜你喜欢
  • 2023-04-06
  • 1970-01-01
  • 2016-04-09
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
  • 2019-11-26
  • 2019-12-08
  • 2023-03-03
相关资源
最近更新 更多