Search code examples
javascriptreact-nativeundefined

event.target.value undefined on input change


I finally reached a point where I can't figure it out anymore. My goal is pretty simple. I have an input field in a react native component.

I want to save the value of the input text to the redux state (later). But, I always get undefined on e.target.value. This issue has been posted millions of times and I tried so many solutions. None of them worked. I guess I am missing something else.

Btw. The button is just for getting the most recent state in the log.

This is my component:

import React, {
  Component
} from 'react';
import {
  Button,
  StyleSheet,
  TextInput,
  View
} from 'react-native';
import allActions from '../../actions/allActions';
import {
  useDispatch,
  useSelector
} from 'react-redux';
import store from '../../store';

const styles = StyleSheet.create({
  input: {
    height: 40,
    marginTop: 20,
    borderWidth: 1,
    borderColor: '#d3d3d3',
    padding: 10,
  }
});


class Name extends Component {
  constructor(props) {
    super(props);
    this.state = {
      user: ""
    };

    this.handleChange = this.handleChange.bind(this);
    this.getMyState = this.getMyState.bind(this);
  }

  handleChange(event) {
    event.preventDefault();
    this.setState({
      user: event.target.value
    });
  }

  getMyState(event) {
    event.preventDefault();
    console.log(this.state.user);
  }
  render() {

    return ( <
      View >
      <
      TextInput style = {
        styles.input
      }
      onChange = {
        this.handleChange
      }
      /> <
      Button title = {
        'get log'
      }
      onPress = {
        this.getMyState
      }
      /> <
      /View>
    );
  }
}

export default Name;


Solution

  • For anyone struggeling with this here is my solution I came up with. Thanks to @Maximilian Dietel I realized my initial problem using the onChange instead of onChangeText. After that, I changed the class component to a functional compoenent so that I can use my hooks to save the new state to redux.

    import React, {Component} from 'react';
    import {Button, StyleSheet, Text, TextInput, View} from 'react-native';
    import allActions from '../../actions/allActions';
    import {useDispatch, useSelector} from 'react-redux';
    import store from '../../store';
    
    const styles = StyleSheet.create({
        input: {
            height: 40,
            marginTop: 20,
            borderWidth: 1,
            borderColor: '#d3d3d3',
            padding: 10,
        }
    });
    
    function Name (props) {
        const dispatch = useDispatch();
    
        /**
         * Save the new user to the state
         * @param text
         */
        const handleChange = (text) => {
            dispatch(allActions.userActions.setUser(text));
        }
            return (
                <View>
                    <TextInput
                        style={styles.input}
                        defaultValue={store.getState().user.user}
                        onChangeText={handleChange}
                    />
                </View>
            );
    }
    
    export default Name;