调用setState直接报错,代码提示也没有这个方法,不知道是什么原因 "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20240929/7a15059d1085f2334775f1926b67a9bc.png) import 'package:flutter/material.dart'; // 导入安卓风格的组件 import 'package:http/http.dart' as http; // 导入http库 class HttpDemo extends StatefulWidget { const HttpDemo({super.key}); @override State createState() => _HttpDemoState(); } class _HttpDemoState extends State { var responseShow = ""; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text("学习Http库"),), body: Column(children: [ _doGetBtn(), Text("返回的结果:$responseShow") ],), ); } } _doGetBtn(){ return const ElevatedButton(onPressed: _doGet, child: Text("通过Get发送请求")); } // 发送get请求 void _doGet() async{ var uri = Uri.parse("https://api.geekailab.com/uapi/test/test?requestPrams=11"); var response =await http.get(uri); if(response.statusCode == 200){ setState((){ responseShow = response.body; }); } } 网上查询,暂时无果 "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20240929/353e4ea15c2ed3ecaa285694d56ee305.png)
类组件中setState更新状态不同写法定时器结果不同 使用解构 componentDidMount() { const { n } = this.state this.timer = setInterval(() => { this.setState({ n: n + 1 }) }, 1000); } 不使用解构 componentDidMount() { this.timer = setInterval(() => { this.setState({ n: this.state.n + 1 }) }, 1000); } 为什么两种答案不一样呢,第一个只触发一次,第二个定时器有效,按理来说setState是异步的都不能出发定时器啊,有大佬帮忙解释一下吗
React中的useCallback 下面的代码中"Com"是父组件,"Button"是子组件,子组件接收父组件的"count2"和"setCount2",子组件中使用了"memo(Button)"导出 function Com() { const [count1, setCount1] = useState(0) const [count2, setCount2] = useState(0) const handleClick1 = () => {setCount1(i => i + 1)} const handleClick2 = () => {setCount2(i => i + 1)} // const callbackSetCount2 = useCallback(() => { // setCount2(i => i + 1) // }, [count2]) console.log("$$ ComA render") return ( this is ComA {count1} setCount1(i => i + 1)}>count1 ++ count2 {count2} ) } 子组件"Button" function Button({ handleClick, children }) { console.log(`$$ Rendering button` + children) return ( this is Button.jsx {children} ) } export default memo(Button) 在上面的代码中,如果点击"count1++"的按钮(不使用useCallback),父组件会重新渲染,但是子组件也会刷新,然而子组件中的"count2"依赖没有变化,所以只能是"handleClick2"函数变化了,这只能是因为父组件重新渲染导致了"const handleClick2 = () => {setCount2(i => i + 1)}"这一行重新运行。 所以我们需要使用"useCallback"来将"handleClick2"函数缓存,不会因为重新渲染而导致没有必要的刷新,这样做之后,点击"count1++"的按钮也不会导致子组件刷新了。 这是我对上面代码以及重新渲染机制以及"useCallback"的理解,这样理解对吗? 希望理解"useCallback"以及"setState"之后的更新机制,谢谢各位大佬了