Javascript 类组件外函数中的更新状态

Javascript 类组件外函数中的更新状态,javascript,reactjs,Javascript,Reactjs,我有一个类组件,在其中调用一个函数。我有一个状态变量,希望更新函数中的状态。因为它是不同的函数,所以我无法更新该值。如何获取所选项目的详细信息并更新状态?当我执行setState时,接收以下错误作为“TypeError:this.setState不是函数” 谢谢你的帮助 组成部分 import React, { Component } from 'react' import PropTypes from "prop-types"; import statedist from "./StateDi

我有一个类组件,在其中调用一个函数。我有一个状态变量,希望更新函数中的状态。因为它是不同的函数,所以我无法更新该值。如何获取所选项目的详细信息并更新状态?当我执行setState时,接收以下错误作为“TypeError:this.setState不是函数”

谢谢你的帮助 组成部分

import React, { Component } from 'react'
import PropTypes from "prop-types";
import statedist from "./StateDistrict.json";

const suggestions = statedist.states;


function DownshiftMultiple(props) {
    const { classes } = props;
    const [inputValue, setInputValue] = React.useState("");
    const [selectedItem, setSelectedItem] = React.useState([]);

    function handleKeyDown(event) {
        if (
            selectedItem.length &&
            !inputValue.length &&
            event.key === "Backspace"
        ) {
            setSelectedItem(selectedItem.slice(0, selectedItem.length - 1));
        }
    }

    function handleInputChange(event) {
        setInputValue(event.target.value);
    }

    function handleChange(item) {
        let newSelectedItem = [...selectedItem];
        if (newSelectedItem.indexOf(item) === -1) {
            newSelectedItem = [...newSelectedItem, item];
        }
        setInputValue("");
        setSelectedItem(newSelectedItem);
         this.setState({ SelectedState: newSelectedItem }); // here i want to update selected items

    }

    const handleDelete = item => () => {
        const newSelectedItem = [...selectedItem];
        newSelectedItem.splice(newSelectedItem.indexOf(item), 1);
        setSelectedItem(newSelectedItem);
    };

    return (
        <Downshift
            id="downshift-multiple"
            inputValue={inputValue}
            onChange={handleChange}
            selectedItem={selectedItem}
        >
            {({
                getInputProps,
                getItemProps,
                getLabelProps,
                isOpen,
                inputValue: inputValue2,
                selectedItem: selectedItem2,
                highlightedIndex
            }) => {
                const { onBlur, onChange, onFocus, ...inputProps } = getInputProps({
                    onKeyDown: handleKeyDown,
                    // placeholder: "Select multiple State"
                });

                return (
                    <div className={classes.container}>
                        {renderInput({
                            fullWidth: true,
                            classes,
                            // label: "States",
                            InputLabelProps: getLabelProps(),
                            InputProps: {
                                startAdornment: selectedItem.map(item => (
                                    <Chip
                                        key={item}
                                        tabIndex={-1}
                                        label={item}
                                        className={classes.chip}
                                        onDelete={handleDelete(item)}
                                    />
                                )),
                                onBlur,
                                onChange: event => {
                                    handleInputChange(event);
                                    onChange(event);
                                },
                                onFocus
                            },
                            inputProps
                        })}

                        {isOpen ? (
                            <Paper className={classes.paper} square>
                                {getSuggestions(inputValue2).map((suggestion, index) =>
                                    renderSuggestion({
                                        suggestion,
                                        index,
                                        itemProps: getItemProps({ item: suggestion.state }),
                                        highlightedIndex,
                                        selectedItem: selectedItem2
                                    })
                                )}
                            </Paper>
                        ) : null}
                    </div>
                );
            }}
        </Downshift>
    );
}

class autoCompleteState extends Component {
    constructor(props) {
        super(props);
        this.state = {
            SelectedState:'',
        }
       // this.showProfile = this.showProfile.bind(this)
    }

    render() {
        const { classes, } = this.props;
        return (
            <div>
                <DownshiftMultiple classes={classes} />
            </div>
        )
    }
}
export default withStyles(Styles)(autoCompleteState);

您将处理程序传递给子组件,它将使用要更新的值调用该子组件,并且更新操作在父组件中发生

import React, { Component } from 'react'
import PropTypes from "prop-types";
import statedist from "./StateDistrict.json";

const suggestions = statedist.states;


function DownshiftMultiple(props) {
    const { classes } = props;
    const [inputValue, setInputValue] = React.useState("");
    const [selectedItem, setSelectedItem] = React.useState([]);

    function handleKeyDown(event) {
        if (
            selectedItem.length &&
            !inputValue.length &&
            event.key === "Backspace"
        ) {
            setSelectedItem(selectedItem.slice(0, selectedItem.length - 1));
        }
    }

    function handleInputChange(event) {
        setInputValue(event.target.value);
    }

    function handleChange(item) {
        let newSelectedItem = [...selectedItem];
        if (newSelectedItem.indexOf(item) === -1) {
            newSelectedItem = [...newSelectedItem, item];
        }
        setInputValue("");
        setSelectedItem(newSelectedItem);
        props.setSelectedState(newSelectedItem);

    }

    const handleDelete = item => () => {
        const newSelectedItem = [...selectedItem];
        newSelectedItem.splice(newSelectedItem.indexOf(item), 1);
        setSelectedItem(newSelectedItem);
    };

    return (
        <Downshift
            id="downshift-multiple"
            inputValue={inputValue}
            onChange={handleChange}
            selectedItem={selectedItem}
        >
            {({
                getInputProps,
                getItemProps,
                getLabelProps,
                isOpen,
                inputValue: inputValue2,
                selectedItem: selectedItem2,
                highlightedIndex
            }) => {
                const { onBlur, onChange, onFocus, ...inputProps } = getInputProps({
                    onKeyDown: handleKeyDown,
                    // placeholder: "Select multiple State"
                });

                return (
                    <div className={classes.container}>
                        {renderInput({
                            fullWidth: true,
                            classes,
                            // label: "States",
                            InputLabelProps: getLabelProps(),
                            InputProps: {
                                startAdornment: selectedItem.map(item => (
                                    <Chip
                                        key={item}
                                        tabIndex={-1}
                                        label={item}
                                        className={classes.chip}
                                        onDelete={handleDelete(item)}
                                    />
                                )),
                                onBlur,
                                onChange: event => {
                                    handleInputChange(event);
                                    onChange(event);
                                },
                                onFocus
                            },
                            inputProps
                        })}

                        {isOpen ? (
                            <Paper className={classes.paper} square>
                                {getSuggestions(inputValue2).map((suggestion, index) =>
                                    renderSuggestion({
                                        suggestion,
                                        index,
                                        itemProps: getItemProps({ item: suggestion.state }),
                                        highlightedIndex,
                                        selectedItem: selectedItem2
                                    })
                                )}
                            </Paper>
                        ) : null}
                    </div>
                );
            }}
        </Downshift>
    );
}

class autoCompleteState extends Component {
    constructor(props) {
        super(props);
        this.state = {
            SelectedState:'',
        }
       // this.showProfile = this.showProfile.bind(this)
    }
    setSelectedState = (newState) => {
         this.setState({ SelectedState: newState });
    }
    render() {
        const { classes, } = this.props;
        return (
            <div>
                <DownshiftMultiple classes={classes} setSelectedState={this.setSelectedState}/>
            </div>
        )
    }
}
export default withStyles(Styles)(autoCompleteState);
您不能也不应该直接访问其他组件的上下文来更新其状态,尤其是不使用功能组件

您需要做的是将一个函数作为道具传递给降档多重组件,该组件本身会获取您想要更新状态的值

function DownshiftMultiple(props) {
    /* ... */
    function handleChange(item) {
        let newSelectedItem = [...selectedItem];
        if (newSelectedItem.indexOf(item) === -1) {
            newSelectedItem = [...newSelectedItem, item];
        }
        setInputValue("");
        setSelectedItem(newSelectedItem);
        this.props.onChange(newSelectedItem); // Use the new function prop
    }

    /* ... */
}

class autoCompleteState extends Component {
    /* ... */

    onDMChange = (newSelectedItem) => this.setState({ SelectedState: newSelectedItem });

    render() {
        const { classes, } = this.props;
        return (
            <div>
                <DownshiftMultiple classes={classes} onChange={this.onChange} />
            </div>
        )
    }
}

那里有很多代码。通过将问题归结为最基本的问题,而不是发布整个实现,您可能会得到更多的答案。
// For example your handle delete
const handleDelete = React.useCallback(item => () => {
    const newSelectedItem = [...selectedItem];
    newSelectedItem.splice(newSelectedItem.indexOf(item), 1);
    setSelectedItem(newSelectedItem);
}, [selectedItem]);