Search code examples
reactjsreact-nativereact-native-iosreact-native-0.46

How To Add More component dynamically React Native


I want to add more components after clicking on the button. Can you share code or an idea so that I can implement? As the image shows, every time when user click on the add button, one row / component will be added.


Solution

  • It's where state shining of,

    for example:

    constructor(props) {
       super(props);
    
       this._handleAddButton = this._handleAddButton.bind(this);
    
       this.state = {    /* initial your state. without any added component */
          data: []
       }
    }
    
    _handleAddButton() {
        let newly_added_data = { title: 'new title', content: 'new content goes here' };
    
        this.setState({
            data: [...this.state.data, newly_added_data]
        });
    }
    
    render() {
        let added_buttons_goes_here = this.state.data.map( (data, index) => {
            return (
                <MyComponent key={index} pass_in_data={data} />
            )
        });
    
        return (
            <View>
                <Button title="Add more" onPress={this._handleAddButton} />
                {added_buttons_goes_here}
            </View>
        );
    }
    

    So every time you click the button,

    1. _handleAddButton get called
    2. a new data is added, update with setState()
    3. render() get triggered.
    4. more <MyComponent> added into View and show

    ================

    2017/8/3 edited:

    if you want to further delete <MyComponent>, the prop key should be taken care of. The key act as change detector for react framework, an auto-increment key would suit your case. example:

    _handleAddButton() {
        let newly_added_data = {
            /* psedo code to simulate key auto increment */
            key: this.state.data[this.state.data.length-1].key+1,
            title: 'new title',
            content: 'new content goes here'
        };
    
        this.setState({
            data: [...this.state.data, newly_added_data]
        });
    }
    
    _handleRemoveButton(key) {
        let result = this.state.data.filter( (data) => data.key !== key );
    
        this.setState({
            data: result,
        });
    }
    
    render() {
        let added_buttons_goes_here = this.state.data.map( (data, index) => {
            return (
                <MyComponent key={data.key} pass_in_data={data}>
                    /// psedo code of pass-in remove button as a children
                    <Button title="Remove" onPress={ () => this._handleRemoveButton(data.key) } />
                </MyComponent>
            )
        });
    
        return (
            <View>
                <Button title="Add more" onPress={this._handleAddButton} />
                {added_buttons_goes_here}
            </View>
        );
    }