我试图根据从API获得的用户数据显示一些卡片。但是这个错误一直显示:`警告:React检测到PlanCard调用的钩子顺序发生了变化。如果不修复,这将导致错误和错误。更多信息,请阅读钩子的规则
>
使用状态使用状态
使用状态使用状态
使用状态使用状态
使用效果使用效果
未定义的useContext
^^^^^^^^^^^^^^ `
这是我所有的计划卡文件
const [loading, setLoading] = useState(false),
[showAlert, setShowAlert] = useState(false);
let headless = typeof window !== 'undefined' &&
window.location.search.includes('?headless'),
platform =
typeof window !== 'undefined' &&
window.location.search.includes('platform=')
? new URL(window.location.href).searchParams.get('platform')
: false,
access_token =
typeof window !== 'undefined' &&
window.location.search.includes('access_token=')
? new URL(window.location.href).searchParams.get('access_token')
: false,
plans = [],
payment_plan = null,
plan_id = null,
modal = null,
purchased_from = null;
if (headless && access_token) {
payment_plan = useFetchData(access_token);
plan_id = payment_plan.plan_id;
} else {
// ToDo:
}
if (typeof plan_id === 'string') {
plans = getPlanCards(plan_id, payment_plan.current_plan_status.toLowerCase());
purchased_from = payment_plan.purchased_from;
modal = getPlanCardsANAAlert(purchased_from);
}
};
这也是我的提取计划代码:
import axios from 'axios';
const useFetchData = (access_token) => {
const [plan, setPlan] = useState({});
let componentMounted = true;
useEffect(() => {
const fetchData = async () => {
try {
const response = await axios.get(
`${process.env.GATSBY_API_URL}user/plan/current_plan_detail?token=${access_token}`
);
if (componentMounted) {
setPlan(response.data);
}
} catch (error) {
console.error(error);
}
};
fetchData();
return () => {
componentMounted = false;
};
}, []);
return plan;
};
export default useFetchData;
if 语句中有一个钩子
if (headless && access_token) {
payment_plan = useFetchData(access_token);
plan_id = payment_plan.plan_id;
}
这使得组件渲染之间的钩子不稳定,React使用钩子来确定组件的状态,并跟踪组件在数组中定义的钩子,如果它们在渲染之间不同,这意味着它不能正确地比较状态。看看这里。
要解决此问题,您可以使用如下所示的内容:
const payment_plan = useFetchData(access_token);
if(headless && payment_plan) {
...
} else {
...
}
问题内容: 我正在尝试从一些教程中学习Python。这是我遇到的一个简单例子,使我感到困惑。 正如您在定义字典的第一行中所看到的,该项是字典中的最后一个元素。但是,当我输出字典时,它成为第一个元素。字典的其余部分已重新排序。 我可以知道为什么会这样吗? 如果我使用dict.keys()从字典中提取密钥并按照我认为的顺序对其进行迭代,那会导致不匹配问题吗? 问题答案: 我可以知道为什么会这样吗? 这
当使用带有目标检测API的matpltlib时,该图不会显示,但是在我导入一些测试方法之前,它可以正常工作。 我正在使用Anaconda虚拟环境,python 3.6和google对象检测API。 变化发生在最后一行 之前,我可以像plt一样显示图形。子图(2,2),我得到弹出的数字和以下内容: 如果您依赖于此处未列出的功能,请提交问题。 plt.get_backend()显示Qt5Agg。但是在
app/movie.component.ts 让我们再回顾一下它背后的逻辑。 当用户单击按钮时,调用方法并更新actor对象的属性。 当变化检测分析绑定到AppComponent模板的属性时,它将看到与之前相同的景象: Is slogan !== previousSlogan No, it’s the same. Is ? No, it’s the same. 让我们重新运行应用程序,但这次我们将
由于双向数据绑定的本质,在Angular 1中不能保证父节点在子节点之前总是被检查。 有可能子节点可以改变父节点或兄弟节点或树中的任何其他节点,这又会在链中触发新的更新。 这使得变化检测机制难以遍历所有节点,并可能掉入具有臭名昭着的“震荡”循环中: 在Angular 2中,改变被保证单向传播。 更改检测器将遍历每个节点一次,始终从根开始。 这意味着父组件始终在其子组件之前检查。
Figure: Change Detector by Vovka is licensed under Public Domain () 变化检测在旧版本的Angular和新版本之间发生了很大的变化。在Angular 1中,框架保留了一长串观察者(每个属性绑定到我们的模板),需要在每次 digest 循环开始时检查。这被称为脏检查,它是唯一可用的变化检测机制。 在Angular 2中,信息流是单向的
问题内容: 什么是的等同 ,和使用生命周期的钩子钩反应一样? 问题答案: 传递一个空数组作为第二个参数,以仅在安装时仅运行回调。 更新发生后立即调用。初始渲染不调用此方法。在每个渲染(包括第一个)上运行。因此,如果要使用严格等同于,则必须使用确定组件是否已安装一次。如果您想要更严格,请使用,但它会同步触发。在大多数情况下,应该足够了。 这个答案受到Tholle的启发,所有功劳归他所有。 在useE