首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >React -将父状态中的一项设置为子状态

React -将父状态中的一项设置为子状态
EN

Stack Overflow用户
提问于 2020-06-11 01:07:23
回答 1查看 46关注 0票数 0

我是一个React新手,并试图通过构建一个简单的报价生成器来学习它,其中报价是根据用户选择的情绪生成的。App组件包含state: quotes和moods (其中每个元素都是一个嵌套对象),它的子元素是Mood组件。

现在,App组件的状态由四种情绪组成,我想要发生的是:当用户单击情绪组件中的按钮时,他/她被重定向到该情绪的页面,并且情绪组件的状态被设置为该特定情绪。

我自己设计的解决方案非常粗糙,我正在寻找一种方法让它变得更优雅/更实用。

下面是应用程序状态的moods对象:

代码语言:javascript
复制
const moods = {
    mood1: {
        type: 'upset',
        image: 'abc.png',
    },
    mood2: {
        type: 'unmotivated',
        image: 'abc.png',
    },
    mood3: {
        type: 'anxious',
        image: 'abc.png',
    },
}

App组件:

代码语言:javascript
复制
state ={
  moods: moods,
}



  render(){
  return (
    <div className="Container">
      <ul className='moods'>
      {
        Object.keys(this.state.moods).map(key => <Mood
          moodsData = {this.state.moods}
          key={key}
          indexKey = {key}
          index={this.state.moods[key].type}
          details={this.state.moods[key]}
          />)
      }
      </ul>
    </div>
  );}}

这是我在情绪组件中的进展情况,按钮上的onClick函数是:

代码语言:javascript
复制
handleClick = (e) => {
this.setState({moods: e.target.value});
}

如果有任何建议,我将不胜感激!花了这么多时间在这上面,我感觉我的大脑再也接受不了Youtube教程/媒体文章了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-11 03:54:13

我注意到的第一件事是你试图在javascript对象上而不是数组上使用map,这在使用一些函数时可能会带来一些问题,所以我建议将它变成一个数组。

如果你只有一个情绪组件,并且基于它接收到的情绪类型改变它的样式,它实际上不需要从内部管理状态,你只需要将道具传递给情绪组件,并处理props接收到的内容。

例如:

以数组形式表示的Moods:

代码语言:javascript
复制
const moods = [
  {
      type: 'upset',
      image: 'abc.png',
  },
  {
      type: 'unmotivated',
      image: 'abc.png',
  },
  {
      type: 'anxious',
      image: 'abc.png',
  },
]

我假设您从服务器或外部源获得情绪列表,这就是为什么我将情绪保持在状态中,而不是仅仅通过const情绪映射。

代码语言:javascript
复制
state ={
    moods: moods,
    mood:null,
  }

  onClick= (key) =>{
    console.log(this.state.moods[key]);
    this.setState({
      mood:this.state.moods[key],
    })
  }

  render(){
    return (
      <div className="Container">
        <ul className='moods'>
        {
          Object.keys(this.state.moods).map((key) => <div key={key}>
            <a onClick={() =>{this.onClick(key)}}>Click here to change the mood to {this.state.moods[key].type}</a>
          </div>)
        }
        </ul>
        {this.state.mood ? <Mood actualMood={this.state.mood}/> : null}
      </div>
    );
  }

而情绪组件只是获得一些道具,并根据它获得的内容显示一些东西:

代码语言:javascript
复制
class Mood extends Component 
{
  render() 
  {
    console.log(this.props.actualMood.type);
    return (
      <div>
       <p>You're looking at {this.props.actualMood.type} mood</p>
      </div>
    );
  }
}

使用react钩子可以很容易地实现这一点,但是基于类的组件需要一个棘手的解决方案,乍一看可能并不容易。

如果你想要实现的是移动到另一个组件,你可以有一个只管理状态的父组件,然后根据一个条件(如果已经选择了mood )呈现一个组件ChooseAMoodComponent或MoodComponent。

实现这一点的另一种方法是通过React Router,您可以通过URL get params传递一些参数。

但最佳实践应该是使用Redux。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62309218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档