Can I update a component's props in React.js?

后端 未结 6 1043
萌比男神i
萌比男神i 2020-11-27 10:15

After starting to work with React.js, it seems like props are intended to be static (passed in from the parent component), while state changes base

相关标签:
6条回答
  • 2020-11-27 10:52

    if you use recompose, use mapProps to make new props derived from incoming props

    Edit for example:

    import { compose, mapProps } from 'recompose';
    
    const SomeComponent = ({ url, onComplete }) => (
      {url ? (
        <View />
      ) : null}
    )
    
    export default compose(
      mapProps(({ url, storeUrl, history, ...props }) => ({
        ...props,
        onClose: () => {
          history.goBack();
        },
        url: url || storeUrl,
      })),
    )(SomeComponent);
    
    0 讨论(0)
  • 2020-11-27 11:02

    PROPS

    A React component should use props to store information that can be changed, but can only be changed by a different component.

    STATE

    A React component should use state to store information that the component itself can change.

    A good example is already provided by Valéry.

    0 讨论(0)
  • 2020-11-27 11:02

    Much has changed with hooks, e.g. componentWillReceiveProps turned into useEffect+useRef (as shown in this other SO answer), but Props are still Read-Only, so only the caller method should update it.

    0 讨论(0)
  • 2020-11-27 11:03

    Props can change when a component's parent renders the component again with different properties. I think this is mostly an optimization so that no new component needs to be instantiated.

    0 讨论(0)
  • 2020-11-27 11:11

    Trick to update props if they are array :

    import React, { Component } from 'react';
    import {
      AppRegistry,
      StyleSheet,
      Text,
      View,
      Button
    } from 'react-native';
    
    class Counter extends Component {
      constructor(props) {
        super(props);
          this.state = {
            count: this.props.count
          }
        }
      increment(){
        console.log("this.props.count");
        console.log(this.props.count);
        let count = this.state.count
        count.push("new element");
        this.setState({ count: count})
      }
      render() {
    
        return (
          <View style={styles.container}>
            <Text>{ this.state.count.length }</Text>
            <Button
              onPress={this.increment.bind(this)}
              title={ "Increase" }
            />
          </View>
        );
      }
    }
    
    Counter.defaultProps = {
     count: []
    }
    
    export default Counter
    const styles = StyleSheet.create({
      container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: '#F5FCFF',
      },
      welcome: {
        fontSize: 20,
        textAlign: 'center',
        margin: 10,
      },
      instructions: {
        textAlign: 'center',
        color: '#333333',
        marginBottom: 5,
      },
    });
    
    0 讨论(0)
  • 2020-11-27 11:17

    A component cannot update its own props unless they are arrays or objects (having a component update its own props even if possible is an anti-pattern), but can update its state and the props of its children.

    For instance, a Dashboard has a speed field in its state, and passes it to a Gauge child thats displays this speed. Its render method is just return <Gauge speed={this.state.speed} />. When the Dashboard calls this.setState({speed: this.state.speed + 1}), the Gauge is re-rendered with the new value for speed.

    Just before this happens, Gauge's componentWillReceiveProps is called, so that the Gauge has a chance to compare the new value to the old one.

    0 讨论(0)
提交回复
热议问题