javascript - 不要使用构造函数

标签 javascript reactjs

在我的代码中,我没有使用constructor()。我一直看到人们在类组件中使用构造函数,但即使我没有在该代码中使用它,它也能完美地工作。在我的代码中,将状态放在构造函数之外,这是一个好主意还是使用其中设置了状态的构造函数更好?它会在未来出现某种错误,或者会降低我的系统性能吗?在这种情况下,更明智的做法是什么?

import React, { Component, Fragment } from 'react'
import  {Redirect} from 'react-router-dom'
import { connect } from 'react-redux'

import ActionCreator from '../redux/actionCreators'

import Button from '../elements/Button'

const statsgenre = {
'Ação': 'Action',
'Comédia': 'Comedy',
'Drama': 'Drama'
} 


const statsuser = {
'Assistido' : 'Watched',
'Assistindo': 'Watching',
'Assistir': 'Watch' 
}


class ScreensEditSeries extends Component{

state = {
    id: '',
    name: '',
    status: '',
    genre: '',
    notes: ''
}

componentDidMount = () => {    
    const serie  = {...this.props.match.params}
    this.props.load(serie)
    this.props.reset()
}

static getDerivedStateFromProps(newProps, prevState){
    let serie = {}
    if (prevState.name === '' || prevState.name === undefined){  
        if (newProps.series.serie.name !== prevState.name){
            serie.name = newProps.series.serie.name
        }

        if (newProps.series.serie.genre !== prevState.genre){
            serie.genre = newProps.series.serie.genre
        }

        if (newProps.series.serie.status !== prevState.status){
            serie.status = newProps.series.serie.status
        }
        if (newProps.series.serie.notes !== prevState.notes){
            serie.notes = newProps.series.serie.notes
        }
        return serie
    }           
}

saveSeries = () => {
    const {name, status, genre, notes} = this.state
    const id = this.props.match.params.id
    const newSerie = {
        id,
        name,
        status,
        genre,
        notes
    }
    this.props.save(newSerie)
}

handleChange = field => event => {
    this.setState({[field] : event.target.value})
}

render(){
    return (
        <Fragment>
            <div className="container">         
                <div>  
                    {this.props.series.saved  && <Redirect to={`/series/${this.props.match.params.genre}`}/>}
                    <h1 className='text-white'>Edit Série</h1>
                    {!this.props.series.isLoadding && <Button>
                        Name: <input type="text" value={this.state.name} onChange={this.handleChange('name')} className="form-control" /><br />
                        Status: {<span>&nbsp;</span>} 
                        <select value={this.state.status} onChange={this.handleChange('status')}>
                            {Object.keys(statsuser)
                                .map( key => <option key={key}>{statsuser[key]}</option>)}
                        </select><br/><br/>
                        Genre: {<span>&nbsp;</span>} 
                        <select value={this.state.genre} onChange={this.handleChange('genre')}>
                            {Object.keys(statsgenre)
                                .map(key => <option key={key}>{statsgenre[key]}</option>)}
                        </select><br/><br/>
                        Notes: <textarea type='text' value={this.state.notes} onChange={this.handleChange('notes')} className="form-control"></textarea><br />
                        <button className="button button2" type="button" onClick={this.saveSeries}>Save</button>
                    </Button>}
                    {this.props.series.isLoadding && <p className='text-info'>Loading...</p>}
                </div>
            </div>
        </Fragment>
    )
}
}

const mapStateToProps = state => {
return {
    series: state.series
}
}

const mapDispatchToProps = dispatch => {
return {
    load : serie => dispatch(ActionCreator.getSerieRequest(serie)),
    save: newSerie => dispatch(ActionCreator.updateSerieRequest(newSerie)),
    reset : () => dispatch(ActionCreator.seriesReset()),
}

}

export default connect(mapStateToProps, mapDispatchToProps)(ScreensEditSeries) 

最佳答案

一般来说,如果您在首次创建类时需要逻辑,或者如果您的设置取决于传入的 props,那么您应该只使用构造函数。因为初始状态中的所有内容都是硬编码的,所以在这种情况下不使用构造函数是可以的案例。

关于javascript - 不要使用构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54137106/

相关文章:

javascript - 搜索完成后如何隐藏我的 HTML 表格?

javascript - 如何在 PHP JSON 编码结果中包含谷歌分析?

javascript - 如何设置 Material-ui 文本字段的样式

javascript - ReacjJS : Parse HTML from strings and use it

javascript - 难以理解 React setState 异步性

javascript - 如何使用Web Audio API更改点击时的音频位置?

javascript - Three.js 四元数 slerp 在极点附近给出了糟糕的结果

javascript - JavaScript 脚本仅在 Internet Explorer 开发人员工具栏可见时在 Internet Explorer 上运行

javascript - React 中的匿名类

reactjs - React中的 `render()`方法什么时候被调用