当前位置: 首页 > 知识库问答 >
问题:

React JS:如何设置孙子状态

姬康平
2023-03-14

我是一个初级程序员,努力理解我应该如何处理孙子状态(或者看看有孙子状态是否是个好主意)。

我的问题是。。。

1.是否可以通过this.setState((prevState))更改孙子?

2.在美国生孙子是个坏主意吗?

为了举例说明,这里是一个组件的构造函数。

constructor(props) {
 super(props);
 this.state = {
   input: {
     example: "",
   },
   invalid:{
     example: false
   },
 };
 this.handleChange = this.handleChange.bind(this);
 this.submit = this.submit.bind(this);
}

我把this.state.invalid看作是子,而this.state.invalid.example看作是孙子。

这里是一个JSX。

<div className="input">
   <input type="text" value={this.state.input.example || ''} onChange={this.handleChange} />
   { this.state.invalid.example ? <span> This input is invalid </span> : null }
</div>
//Here are similar input fields...

<button onClick={this.submit} type="button">Submit</button>

当触发onClick={this.submit}时,我想验证函数'this.submit'中的输入。

submit(){
 for (var key in this.state.input) {
   if(!this.state.input[key]){
     this.setState((prevState, key) => ({
        invalid[key]:true, //This causes an error, saying that "SyntaxError: Unexpected token, expected ,"
    }));
   }
 }

在这个例子中,this.state.invalid.example应该被设置(即更改),但是上面的代码不起作用。

也许分解此应用程序并生成

因为我不知道我周围有谁在学习ReactJS,任何建议都将不胜感激!


共有3个答案

璩华辉
2023-03-14

如果您想这样做,方法是:

constructor() {
    this.state = {
        input: {
            example: "",
        },
        invalid:{
            example: false
        },
    };
}

assignChildState(state) {
    var state = Object.assign({}, this.state);
    state.input = Object.assign({}, state.input);
    state.input.example = "New Value";
    this.setState(state);
}

您当然可以创建一个函数来处理它,类似于:

function assignChildState(path, value) {
    var pieces = path.split(".");
    var state = Object.assign({}, this.state);
    var current = state;
    for (var i = 0; i < pieces.length - 1; i++) {
        var piece = pieces[i];
        console.log(current, piece);
        if (current[piece].toString() === "[object Object]") {
            current[piece] = Object.assign({}, current[piece]);
        } else if (typeof current[piece] === "object" /* array */) {
            current[piece] = current[piece].concat();
        }
        current = current[piece];
    }
    current[pieces[i]] = value;
    this.setState(state);
}

然后你可以做:

this.assignChildState("input.example", true);

它将适当地更新子状态。

尽管如此,我肯定会研究redux或flux,或者我个人最喜欢的flummox。

朱鸿畅
2023-03-14

我认为在组件中嵌套状态本身并不是一个坏主意。但是要记住,setState

将nextState浅合并到当前状态

请参阅react文档中的。

所以如果你的州是

{ 
  input: {
    example: "asd",
    other: "123"
  },
  invalid: {
    example: false,
    other: false
  }
}

然后调用setState({invalid:{example:true}}}),结果状态如下

{ 
  input: {
    example: "asd",
    other: "123"
  },
  invalid: {
    example: true
  }
}

注意,invalid下的所有内容都被替换为新状态,而input下的对象保持不变(即执行浅合并)。

在您的提交函数中,我将在循环中创建整个无效对象,然后像这样调用setState。

最后一个代码段中的错误只是语法错误。不能像这样构造对象:{invalid[key]:true},它应该是{invalid:{[key]:true}

郭阳泽
2023-03-14

不能按状态将祖先组件的状态传递给后代组件。你可以通过道具来完成,但它会导致道具向下传递许多级别。上下文也有可能,但这也不是好方法。

最好的方法是使用助焊剂或还原剂。我更喜欢redux,在redux中,你可以通过使用连接方法从一个存储中获取你的对象需要的变量。

https://github.com/reactjs/react-redux/blob/master/docs/api.md

也检查这些视频

 类似资料:
  • 当您通过提交表单调用API请求时,如何设置Axios响应?我想从/在POST方法中发送表单,并获得API响应,然后用API响应重定向到/result页面。我的代码在下面,它引发 警告:无法对卸载的组件执行React状态更新。 这是一个no-op,但它表示应用程序中存在内存泄漏。 若要修复,请取消useEffect清理函数中的所有订阅和异步任务。在家(在app.js:21) 完成handleSubm

  • 我有一个祖父母组件,它通过在数组上映射来呈现卡片父组件。那些家长卡上有孩子。处理表单提交功能的调用在祖父母中。我怎么知道表格来自哪位家长? 我读了好几次这篇文章来解释道具和状态之间的区别,我认为我可能需要进入状态而不是道具,但是当我在函数中,它是空的。 在我做作的例子中,我有一套猴子和一套纸杯蛋糕。纸杯蛋糕包含对猴子的引用(存储在mongodb和my state中),因此每个纸杯蛋糕都属于一只猴子

  • 问题内容: 我有以下基于渲染下拉列表呈现用户的类。如果我选择“字母”,则将按字母顺序列出用户;当我选择“组”时,将按组顺序列出用户。 在组件中,我正在通过props.members中的函数设置组件状态对象。 当我选择“组”排序时,组件正在卸载并且正在DOM中安装。同样,当我切换回“字母”排序时,在组件中预先设置的状态变量(成员)将变为NULL,因为该组件已从DOM中删除。 重新渲染b’coz时道具

  • 父组件如何与孙子组件进行状态同步

  • 问题内容: constructor(){ super(); this.state = { address: { street:null, city:null, postalCode: null } }; } postalCodeChange(e){ this.setState.address.postalCode = e.target.value; console.log(this.state);

  • 提前谢了。我有一个状态数组,如下所示。 我需要添加一个项目到状态数组,我发现我们不需要做状态突变。如何使用PrevState设置状态。 如何调用set State以追加此状态数组。 像这样的东西?