Как отобразить список опций с помощью renderOption в пользовательском интерфейсе material

#reactjs #material-ui

#reactjs #материал-пользовательский интерфейс

Вопрос:

Я хочу изменить цвет фона параметров внутри Autocomplete компонента, и самое близкое, что я могу получить, — это использовать renderOption prop.

Проблема в том, что я не могу понять, как перебирать (используя map() ) параметры, которые у меня есть в моем состоянии.

То, что я хотел бы сделать, это что-то вроде

 {state.myOptions.map( option => {
    // here I would like to call renderOption = .....
}
  

Внутри <Autocomplete/> компонента

Возможно ли реализовать что-то подобное или есть четко определенный способ сделать это?

Редактировать

Это компонент

 import React, { useEffect } from 'react'
import { useForm, Form } from './hooks/useForm'
import EventIcon from '@material-ui/icons/Event';
import { makeStyles, TextField, Typography } from '@material-ui/core'
import CustomTextField from './inputs/CustomTextField';
import { Autocomplete } from '@material-ui/lab';
import { connect } from 'react-redux'




    const EventForm = (props) => {
    
        // Redux 
        const { family } = props
    
        // React 
        const initialState = {
            email: "",
            password: "",
            errors: {
                email: "",
                password: ""
            },
            familyMembers: ["rgeg"]
        }
    
        const { state, handleOnChange, setState } = useForm(initialState)
    
        
    
        useEffect(() => {
            family amp;amp; state.familyMembers !== family.members amp;amp; setState({
                ...state,
                familyMembers: family.members
            })
        })
    
        // Material UI
        const useStyles = makeStyles(theme => (
            {
                message: {
                    marginTop: theme.spacing(3)
                },
                icon: {
                    backgroundColor: "lightgrey",
                    padding: "10px",
                    borderRadius: "50px",
                    border: "2px solid #3F51B5",
                    marginBottom: theme.spacing(1)
    
                },
                typography: {
                    marginBottom: theme.spacing(1),
                    marginTop: theme.spacing(4)
                },
                customTextField: {
                    marginTop: theme.spacing(0)
                },
                dateTimeWrapper: {
                    marginTop: theme.spacing(4)
                }
            }
        ))
    
        const classes = useStyles()
    
        return (
            <>
                <div>WORK IN PROGRESS...</div>
                <br />
                <br />
                <EventIcon className={classes.icon} />
                <Form
                    title="Add new event"
                >
                    <Typography
                        variant="subtitle1"
                        className={classes.typography}
                        align="left">
                        Enter a title for this event
                        </Typography>
                    <CustomTextField
                        className={classes.customTextField}
                        label="Title"
                    />
                    <Typography
                        variant="subtitle1"
                        className={classes.typography}
                        align="left">
                        Enter a location for this event
                        </Typography>
                    <CustomTextField
                        className={classes.customTextField}
    
                        label="Location"
                    />
                    <Typography
                        variant="subtitle1"
                        className={classes.typography}
                        align="left">
                        Which member/s of the family is/are attending
                        </Typography>
                    <Autocomplete
                        multiple
                        id="tags-outlined"
                        options={state.familyMembers}
                        getOptionLabel={(option) => option.name}
                        // defaultValue={[familyMembers[0]]}
                        filterSelectedOptions
                        renderInput={(params) => (
                            <TextField
                                {...params}
                                variant="outlined"
                                label="Members Attending"
                                placeholder="Family Member"
                            />
                        )}
                    />
                </Form>
            </>
        );
    }
    
    // Redux
    const mapStateToProps = (state) => {
        return {
            family: state.auth.family
        }
    }
    
    export default connect(mapStateToProps)(EventForm);
  

Комментарии:

1. Не могли бы вы опубликовать код всего компонента?

2. конечно, делаю это сейчас

Ответ №1:

Если вы хотите переопределить только цвет параметра, вы можете сделать это, переопределив его стили. Нет необходимости создавать пользовательскую функцию рендеринга опций.

Выше приведен пример того, как вы можете этого добиться.

 import React, { useEffect } from 'react'
import { useForm, Form } from './hooks/useForm'
import EventIcon from '@material-ui/icons/Event';
import { makeStyles, TextField, Typography } from '@material-ui/core'
import CustomTextField from './inputs/CustomTextField';
import { Autocomplete } from '@material-ui/lab';
import { connect } from 'react-redux'

const EventForm = (props) => {
    // Redux 
    const { family } = props

    // React 
    const initialState = {
        email: "",
        password: "",
        errors: {
            email: "",
            password: ""
        },
        familyMembers: ["rgeg"]
    }

    const { state, handleOnChange, setState } = useForm(initialState)

    useEffect(() => {
        family amp;amp; state.familyMembers !== family.members amp;amp; setState({
            ...state,
            familyMembers: family.members
        })
    })

    // Material UI
    const useStyles = makeStyles(theme => (
        {
            message: {
                marginTop: theme.spacing(3)
            },
            icon: {
                backgroundColor: "lightgrey",
                padding: "10px",
                borderRadius: "50px",
                border: "2px solid #3F51B5",
                marginBottom: theme.spacing(1)

            },
            typography: {
                marginBottom: theme.spacing(1),
                marginTop: theme.spacing(4)
            },
            customTextField: {
                marginTop: theme.spacing(0)
            },
            dateTimeWrapper: {
                marginTop: theme.spacing(4)
            },
            option: {
              backgroundColor: 'red'
            }
        }
    ))

    const classes = useStyles()

    return (
        <>
            <div>WORK IN PROGRESS...</div>
            <br />
            <br />
            <EventIcon className={classes.icon} />
            <Form
                title="Add new event"
            >
                <Typography
                    variant="subtitle1"
                    className={classes.typography}
                    align="left">
                    Enter a title for this event
                    </Typography>
                <CustomTextField
                    className={classes.customTextField}
                    label="Title"
                />
                <Typography
                    variant="subtitle1"
                    className={classes.typography}
                    align="left">
                    Enter a location for this event
                    </Typography>
                <CustomTextField
                    className={classes.customTextField}
                    label="Location"
                />
                <Typography
                    variant="subtitle1"
                    className={classes.typography}
                    align="left">
                    Which member/s of the family is/are attending
                    </Typography>
                <Autocomplete
                    multiple
                    id="tags-outlined"
                    classes={{
                        option: classes.option
                    }}
                    options={state.familyMembers}
                    getOptionLabel={(option) => option.name}
                    // defaultValue={[familyMembers[0]]}
                    filterSelectedOptions
                    renderInput={(params) => (
                        <TextField
                            {...params}
                            variant="outlined"
                            label="Members Attending"
                            placeholder="Family Member"
                        />
                    )}
                />
            </Form>
        </>
    );
}

// Redux
const mapStateToProps = (state) => {
    return {
        family: state.auth.family
    }
}

export default connect(mapStateToProps)(EventForm);
  

Комментарии:

1. Спасибо, это было полезно, но то, что я пытаюсь изменить, — это цвет маленького значка с выбранным параметром. Мне удалось сделать это с помощью классов, но я хочу отображать каждый div на основе цвета элемента в состоянии, и проблема, с которой я столкнулся, заключается в том, что я не могу использовать обратные ссылки для динамического таргетирования «amp; MuiChip-root MuiAutocomplete-tag MuiChip-deletable[data-tag-index[«независимо от того, какой индекс является свойством «]» в зависимости от индекса тега данных.

2. Мне удалось настроить таргетинг на то, что я хотел, а именно на «тег», но я все еще не могу понять, как настроить таргетинг на основе динамического индекса данных-тегов

Ответ №2:

Вау, это заняло некоторое время, но решение, похоже, использует ‘renderTags’ algong с

вот точное решение

 import React, { useEffect } from 'react'
import { useForm, Form } from './hooks/useForm'
import EventIcon from '@material-ui/icons/Event';
import { makeStyles, TextField, Typography } from '@material-ui/core'
import CustomTextField from './inputs/CustomTextField';
import { Autocomplete } from '@material-ui/lab';
import { connect } from 'react-redux'
import Chip from '@material-ui/core/Chip';
import getColorvalue from './outputs/ColorValues'




const EventForm = (props) => {

    // Redux 
    const { family } = props

    // React 
    const initialState = {
        email: "",
        password: "",
        errors: {
            email: "",
            password: ""
        },
        familyMembers: ["rgeg"]
    }

    const { state, handleOnChange, setState } = useForm(initialState)



    useEffect(() => {
        family amp;amp; state.familyMembers !== family.members amp;amp; setState({
            ...state,
            familyMembers: family.members
        })
    })

    // Material UI
    const useStyles = makeStyles(theme => (
        {
            message: {
                marginTop: theme.spacing(3)
            },
            icon: {
                backgroundColor: "lightgrey",
                padding: "10px",
                borderRadius: "50px",
                border: "2px solid #3F51B5",
                marginBottom: theme.spacing(1)

            },
            typography: {
                marginBottom: theme.spacing(1),
                marginTop: theme.spacing(4)
            },
            customTextField: {
                marginTop: theme.spacing(0)
            },
            dateTimeWrapper: {
                marginTop: theme.spacing(4)
            }
        }
    ))

    const classes = useStyles()

    return (
        <>
            <div>WORK IN PROGRESS...</div>
            <br />
            <br />
            <EventIcon className={classes.icon} />
            <Form
                title="Add new event"
            >
                <Typography
                    variant="subtitle1"
                    className={classes.typography}
                    align="left">
                    Enter a title for this event
                    </Typography>
                <CustomTextField
                    className={classes.customTextField}
                    label="Title"
                />
                <Typography
                    variant="subtitle1"
                    className={classes.typography}
                    align="left">
                    Enter a location for this event
                    </Typography>
                <CustomTextField
                    className={classes.customTextField}

                    label="Location"
                />
                <Typography
                    variant="subtitle1"
                    className={classes.typography}
                    align="left">
                    Which member/s of the family is/are attending
                    </Typography>
                <Autocomplete
                    multiple
                    id="tags-outlined"
                    renderTags={(value, getTagProps) =>
                        value.map((option, index) => (
                            <Chip
                                variant="outlined"
                                key={option}
                                style={{
                                    backgroundColor: `${getColorvalue(state.familyMembers[state.familyMembers.indexOf(option)].color)}`,
                                    color: "white"
                                }}
                                label={option.name}
                                onDelete={() => console.log("test")}
                                {...getTagProps({ index })}
                            />
                        ))
                    }
                    options={state.familyMembers}
                    getOptionLabel={(option) => option.name}
                    // defaultValue={[familyMembers[0]]}
                    filterSelectedOptions
                    renderInput={(params) => (
                        <TextField
                            {...params}
                            variant="outlined"
                            label="Members Attending"
                            placeholder="Family Member"
                        />
                    )}
                />
            </Form>
        </>
    );
}

// Redux
const mapStateToProps = (state) => {
    return {
        family: state.auth.family
    }
}

export default connect(mapStateToProps)(EventForm);