【问题标题】:React Passing data to componentsReact 向组件传递数据
【发布时间】:2018-05-27 17:04:44
【问题描述】:

我有一个父有状态组件,我将显示对话框的状态传递给一个无状态标题组件。 当一个图标单击标题组件时,它会打开一个无状态对话框组件。 在无状态对话框组件中,我希望能够将数据输入到文本字段中。 我是否必须完全更改我的代码才能使无状态对话框成为有状态组件? 下面是我的代码。如果有人可以推荐这样做的最佳方法。谢谢。

class Layout extends Component {
    state = {
      show:false  
    }

    toggleSidenav = (action) =>{
        this.setState({
            showDialog:action
        })
    }

    render(){
        return(
            <div>
                <Header
                    showNav={this.state.showDialog}
                    onHideNav={() => this.toggleSidenav(false)}
                    onOpenNav={() => this.toggleSidenav(true)}
                />
            </div>
        )
    }

}
export default Layout;

标题组件

const Header = (props) => {
    console.log(props.onOpenNav)

    const navBars = () => (
        <div>
            <AppBar position="static">
                <Toolbar>
                    <IconButton color="inherit" aria-label="createfolder">
                        <SvgIcon>
                            <path d={createfolder}
                                 onClick={props.onOpenNav}
                                name="firstName" />
                        </SvgIcon>
                    </IconButton>
                </Toolbar>
            </AppBar>
        </div>
    )
    return (
        <div>
            <SideNav {...props} />
            <div>
                {navBars()}
            </div>
        </div>
    )
}

对话框组件

const DialogBox = (props) => {
    return (
        <div>
            <Dialog
                open={props.showNav}
                aria-labelledby="form-dialog-title">
                <DialogTitle id="form-dialog-title">Add Folder</DialogTitle>
                <DialogContent>
                    <TextField
                        margin="normal"
                    />
                </DialogContent>
                 <DialogActions>
              <Button onClick={props.onHideNav} color="primary">
              Cancel
      </Button>
          <Button onClick={props.onHideNav} color="primary"
              onChange={this.handleFieldChange}
              value={this.value}
             >
              Create
      </Button>
          </DialogActions>

            </Dialog>
        </div>
    )
}

【问题讨论】:

  • 您必须将输入作为状态保存在某处。不一定要在DialogBox中,可以放在父组件中,通过props传递给DialogBox

标签: reactjs


【解决方案1】:

因为组件Header 很容易有状态。您可以将其状态初始化为

state = {
      show:false,
      formData: {}  //later, you may save user input from the child component here 
    }

Header组件中,你可以添加一个函数:

handleInputEntered = (event) => {
  const _data = { ...this.state.formData };
  _data[event.target.name] = event.target.value;

  this.setState({
    formData: _data
  });
}

并确保将这个新函数作为道具传递给这样的:

<Header 
    handleInputEntered = {this.handleInputEntered}
    />

并将onChange 设置为您有输入字段的新功能:

<TextField
           onChange={this.props.handleInputEntered}     
                    />

您似乎正在使用MaterialUI,因此只需查看如何将onChange 属性提供给TextField 组件即可。

这清楚吗?

【讨论】:

  • 我的布局组件是有状态的,而我的标题组件是无状态的组件。我还是有点困惑
  • 当我尝试执行与您所说的类似的操作时,我收到一条错误消息,提示 Unexpected use of 'name' no-restricted-globals
  • 是的,您的 Header 组件是无状态的。因此,当您将道具传递给 时,您应该写:onChange={props.handleInputEntered} 而不是 this.props.handleInputEntered
猜你喜欢
  • 2018-05-25
  • 2017-08-04
  • 2020-04-03
  • 1970-01-01
  • 2018-07-14
  • 2021-11-06
  • 2021-10-17
  • 2017-05-21
  • 2016-03-04
相关资源
最近更新 更多