Как в форме сделать доступность к селекту (альбомы) только после выбора артиста?

Имеется форма:


    import React, {
        useEffect,
        useState,
    } from 'react';
    
    import {
        useDispatch,
        useSelector,
    } from 'react-redux';
    
    import {
        Button,
        Grid,
    } from '@material-ui/core';
    
    import { fetchAlbums } from '../../store/actions/albumActions';
    import { fetchArtists } from '../../store/actions/artistsActions';
    import FormElment from '../UI/FormElement/FormElement';
    
    const AlbumForm = props => {
        const [state, setState] = useState({
            title: "",
            album: "",
            duration: "",
            numbering: ""
        });
      
        const dispatch = useDispatch();
        const artists = useSelector(state => state.artists.artists);
        const albums = useSelector(state => state.albums.albums);
      
        const inputChangeHandler = e => {
            const {name, value} = e.target;
            setState(prevState => {
                return {...prevState, [name]: value};
            });
        };
    
        useEffect(() => {
            dispatch(fetchArtists());
            dispatch(fetchAlbums());
        }, [dispatch]);
    
        const formSubmitHandler = e => {
            e.preventDefault();
            const formData = new FormData();
            Object.keys(state).forEach(key => {
                formData.append(key, state[key]);
            
            });
            props.onSubmit(formData);
        };
    
        return (
            <form onSubmit={formSubmitHandler}>
                <Grid container direction="column" spacing={2}>
                    <FormElment 
                        name={"title"}
                        required={true}
                        label={"Track title"}
                        value={state.title}
                        onChange={inputChangeHandler}
                        type={"input"}
                    />
                    <FormElment 
                        label="Track artist"
                        name="artist"
                        onChange={inputChangeHandler}
                        value={state.artist}
                        options={artists}
                        type={"select"}
                    />
                    <FormElment 
                        required={true}
                        label="Track album"
                        name="album"
                        onChange={inputChangeHandler}
                        value={state.album}
                        options={albums}
                        type={"select"}
                    />
                    <FormElment 
                        name={"duration"}
                        required={true}
                        label={"Track duration"}
                        onChange={inputChangeHandler}
                        value={state.duration}
                        type={"input"}
                    />
                    <FormElment 
                        required={true}
                        label="Track numbering"
                        name="numbering"
                        onChange={inputChangeHandler}
                        value={state.numbering}
                        type={"input"}
                    />
                    <Grid item>
                        <Button type="submit" color="primary">
                            Create
                        </Button>
                    </Grid>
                </Grid>
            </form>
        );
    };
      
    export default AlbumForm;

как сделать доступ к селекту album только после сделанного выбора в селекте artist. В селекте albums должны быть толлько альбомы данного артиста.

это страница с формой:


    import React from 'react';
    
    import { useDispatch } from 'react-redux';
    
    import { Typography } from '@material-ui/core';
    
    import TrackForm from '../../components/TrackForm/TrackForm';
    import { createTrack } from '../../store/actions/tracksActions';
    
    const NewTrack = props => {
        const dispatch = useDispatch();
        const formSubmitHandler = async track => {
            await dispatch(createTrack(track));
            props.history.push("/");
    };
    
      
    
        return (
            <>
                <Typography variant="h4">
                    New Track
                </Typography>
                <TrackForm onSubmit={formSubmitHandler} />
            </>
        );
    };
    
    export default NewTrack;

это trackActions:


    import axios from '../../axios-music';
    import {
        CREATE_TRACK_SUCCESS,
        FETCH_TRACKS_SUCCESS,
    } from '../actionTypes';
    
    const fetchTracksSuccess = tracks => {
        return {type: FETCH_TRACKS_SUCCESS, tracks};
    };
    
    export const fetchTracks = (albumId) => {
        const id = albumId;
        return async (dispatch) => {
            try {
                const response = await axios.get(`/tracks?album=${id}`);
                dispatch(fetchTracksSuccess(response.data));
            } catch (err) {
                console.log(err);
            }
        };
    };
    
    const createTrackSuccess = () => {
        return {type: CREATE_TRACK_SUCCESS};
    };
      
    export const createTrack = track => {
        return async (dispatch) => {
            try {
                await axios.post("/tracks", track);
                dispatch(createTrackSuccess());
            } catch(e) {
                console.log(e);
            }
        };
    };

albumsActions:


    import axios from '../../axios-music';
    import {
        CREATE_TRACK_SUCCESS,
        FETCH_TRACKS_SUCCESS,
    } from '../actionTypes';
    
    const fetchTracksSuccess = tracks => {
        return {type: FETCH_TRACKS_SUCCESS, tracks};
    };
    
    export const fetchTracks = (albumId) => {
        const id = albumId;
        return async (dispatch) => {
            try {
                const response = await axios.get(`/tracks?album=${id}`);
                dispatch(fetchTracksSuccess(response.data));
            } catch (err) {
                console.log(err);
            }
        };
    };
    
    const createTrackSuccess = () => {
        return {type: CREATE_TRACK_SUCCESS};
    };
      
    export const createTrack = track => {
        return async (dispatch) => {
            try {
                await axios.post("/tracks", track);
                dispatch(createTrackSuccess());
            } catch(e) {
                console.log(e);
            }
        };
    };

artistActions:


    import axios from '../../axios-music';
    import {
        CREATE_ARTIST_SUCCESS,
        FETCH_ARTISTS_SUCCESS,
    } from '../actionTypes';
    
    const fetchArtistsSuccess = artists => {
        return {type: FETCH_ARTISTS_SUCCESS, artists};
    };
    
    export const fetchArtists = () => {
        return async dispatch => {
            try {
                const response = await axios.get("/artists");
                dispatch(fetchArtistsSuccess(response.data));
            } catch(e) {
                console.log(e);
            }
        };
    };
    
    const createArtistSuccess = () => {
        return {type: CREATE_ARTIST_SUCCESS};
    };
    
    export const createArtist = artist => {
        return async (dispatch) => {
            try {
                await axios.post("/artists", artist);
                dispatch(createArtistSuccess());
            } catch(e) {
                console.log(e);
            }
        };
    };

это FormElement


    import React from 'react';
    
    import PropTypes from 'prop-types';
    
    import {
      Grid,
      MenuItem,
      TextField,
    } from '@material-ui/core';
    
    const FormElment = (props) => {
        let textFieldChildren = null
        if (props.type === "select") {
            textFieldChildren = props.options.map((options) => {
                return <MenuItem 
                    selected={options._id === "609a8b0fded55ecf1319479e"} 
                    key={options._id} 
                    value={options._id}
                >
                    {options.title}
                </MenuItem>
            })
        }
    
        return (
            <Grid item xs={12}>
                <TextField
                    variant="outlined"
                    fullWidth
                    required={props.required}
                    id={props.name}
                    select={props.type === "select"}
                    type={props.type}
                    multiline={props.multiline}
                    rows={3}
                    label={props.label}
                    name={props.name}
                    autoComplete={props.name}
                    value={props.value}
                    onChange={props.onChange}
                    error={!!props.error}
                    helperText={props.error}
                >
                    {textFieldChildren}
                </TextField>
            </Grid>
        );
    };
    
    FormElment.propTypes = {
        name: PropTypes.string.isRequired,
        label: PropTypes.string.isRequired,
        value: PropTypes.string.isRequired,
        onChange: PropTypes.func.isRequired,
        type: PropTypes.string.isRequired,
        required: PropTypes.bool,  
        multiline: PropTypes.bool,
        error: PropTypes.string,
        options: PropTypes.arrayOf(PropTypes.object)
    };
    
    export default FormElment;


Ответы (0 шт):