Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何更新状态的脚本_Javascript_Reactjs_Typescript_React Hooks - Fatal编程技术网

Javascript 如何更新状态的脚本

Javascript 如何更新状态的脚本,javascript,reactjs,typescript,react-hooks,Javascript,Reactjs,Typescript,React Hooks,嗨,朋友们,我在从api获取数据后更新状态时遇到问题。有人能帮我弄清楚吗。顺便说一句,我是打字新手 type FrequentlySearches = { value: string; count: string; }; const initialFrequentlySearch: FrequentlySearches[] = [{ value: '', count: '', }]; export const GetFrequentlySearches = (

嗨,朋友们,我在从api获取数据后更新状态时遇到问题。有人能帮我弄清楚吗。顺便说一句,我是打字新手

type FrequentlySearches = {
    value: string;
    count: string;
};

const initialFrequentlySearch: FrequentlySearches[] = [{
    value: '',
    count: '',
}];

export const GetFrequentlySearches = () => {

    const [data, dataSet] = useState(initialFrequentlySearch);

    const fetchFrequentlySearches = useCallback(async () => {
        let response = await fetch(url_pathname)
        let datas = await response.json()
        for (const key in datas) {
            // how  to update the state here !!!
            dataSet({
                value: datas[key].value,
                count: datas[key].count
            })
        }

    }, [url_pathname])


    useEffect(() => {
        fetchFrequentlySearches()
    }, [url_pathname])

};
你需要

(1) 正确键入
fetch
,请参阅

(2)
数据
是一个对象数组,因此

        dataSet({
            value: datas[key].value,
            count: datas[key].count
        })
没有多大意义-将对象数组传递给状态设置器函数

将响应的对象值作为一个数组可能会更容易——无需手动迭代

useCallback
也是完全多余的

export const GetFrequentlySearches = () => {
    const [data, setData] = useState(initialFrequentlySearch);
    useEffect(() => {
        fetch(url_pathname)
        .then((response => response.json()))
        .then((datasUntyped) => {
            const datas = datasUntyped as FrequentlySearches[];
            setData(Object.values(datas));
        })
        // .catch(handleErrors);
    }, [url_pathname])

}
如果API结果是一个对象数组,而不是一个对象对象,那么您根本不需要
object.values
,只需这样做即可

setData(datas);
如果API结果包含需要排除的其他对象属性,请首先映射数组以删除它们:

setData(
  Object.values(datas)
    .map(obj => ({ value: obj.value, count: obj.count }))
);

它显示类型为“{value:any;count:any;}”的>>>参数不能分配给类型为“SetStateAction”的参数。Object literal只能指定已知的属性,而“value”在类型“SetStateAction”中不存在。ts(2345)看起来您的数据以您需要的形状返回,但您正在尝试对其进行迭代,每次都将其设置为单个对象,而不是数组。为什么不直接做
数据集(datas)
?谢谢你的回复,我要注意你的观点。:)