我刚刚从反应类过来,开始思考钩子和功能组件。我有一段加载地图脚本的代码
let autoComplete;
// dynamically load JavaScript files in our html with callback when finished
const loadScript = (url, callback) => {
let script = document.createElement("script"); // create script tag
script.type = "text/javascript";
// when script state is ready and loaded or complete we will call callback
if (script.readyState) {
script.onreadystatechange = function () {
if (script.readyState === "loaded" || script.readyState === "complete") {
script.onreadystatechange = null;
callback();
}
};
} else {
script.onload = () => callback();
}
script.src = url; // load by url
document.getElementsByTagName("head")[0].appendChild(script); // append to head
};
// handle when the script is loaded we will assign autoCompleteRef with google maps place autocomplete
function handleScriptLoad(updateQuery, autoCompleteRef) {
// assign autoComplete with Google maps place one time
autoComplete = new window.google.maps.places.Autocomplete(
autoCompleteRef.current,
{
types: ["establishment"],
strictBounds: true,
fields: ["address_components", "name", "geometry"],
componentRestrictions: { country: "us" },
}
);
autoComplete.setFields(["address_components", "formatted_address"]); // specify what properties we will get from API
// add a listener to handle when the place is selected
autoComplete.addListener("place_changed", async () => {
handlePlaceSelect(updateQuery);
});
}
我需要从下面的函数中设置状态或更新状态,但它不是保持状态的主函数
function handlePlaceSelect(updateQuery) {
const [coodinates, setCoordinates] = useState({
lat: null,
lng: null,
});
const addressObject = autoComplete.getPlace(); // get place from google api
const query = addressObject.formatted_address;
updateQuery(query);
var address = "";
if (addressObject.address_components) {
address = [
(addressObject.address_components[0] &&
addressObject.address_components[0].short_name) ||
" , ",
(addressObject.address_components[1] &&
addressObject.address_components[1].short_name) ||
" , ",
(addressObject.address_components[2] &&
addressObject.address_components[2].short_name) ||
" , ",
].join(", ");
}
var completeAddress = addressObject.name + ", " + address;
console.log(completeAddress);
console.log("Latitude: " + addressObject.geometry.location.lat());
console.log("Longitude: " + addressObject.geometry.location.lng());
/// heres where am trying to update state of coordinates when a place is changed
setCoordinates({
lat: addressObject.geometry.location.lat(),
lng: addressObject.geometry.location.lng()
})
}
下面的主要功能是加载use效果
中的映射脚本。
function Storelocation({ setTab }) {
const [query, setQuery] = useState("");
const autoCompleteRef = useRef(null);
const [address, setAddress] = React.useState("");
const [coordinates, setCoordinates] = React.useState({
lat: null,
lng: null
});
useEffect(() => {
loadScript(
`https://maps.googleapis.com/maps/api/js?key=AIzaSyCT2wFvkG_abY&libraries=places`,
() => handleScriptLoad(setQuery, autoCompleteRef)
);
}, []);
return (
<input
className=""
required
placeholder="address"
ref={autoCompleteRef}
onChange={(event) => {
setQuery(event.target.value)
}}
defaultValue={query}
></input>
);
}
如何使用这种方式更新状态,即从另一个函数更新状态
您可以将一个函数从stateful组件传递给您的子组件,该子组件使用setState为您管理状态更改。
假设我有以下名为Home的组件: 在PostForm组件与新Post一起提交后,我将如何更新主状态,或者如何从api重新获取数据。
假设我有以下功能文件: 我ogin.feature 功能:登录网站 场景:现场登录验证 给定导航到站点登录页 家特色 功能:欢迎页面验证 场景:验证登录后出现的页面 已成功完成给定登录 登录成功后的页面出现时 然后测试完成 在Home.feature文件中,我需要先执行Login.feature,然后调用home.feature.所以当我从运行器测试中执行home时,它会依次执行login,然后是
问题内容: 我正在尝试将在这里找到的这个很棒的动画转换为React可重用的组件。看来此组件将需要一个父组件作为画布,而许多子组件则为。 出于性能方面的考虑,将它们变成无状态组件可能会更好,因为会有很多这样的组件。我不熟悉制作无状态组件,并且想知道应该在哪里定义和中定义的和函数。 无状态组件的功能是在组件内部还是外部?换句话说,以下哪个更好? 1: 2: 每种都有什么优点/缺点,其中哪一种对我的特定
问题内容: 当我用酶测试类组件时,我可以设置状态。当我用钩子测试功能组件时,现在该怎么做? 例如,在我的组件中,我有: 我想在测试中进行更改 问题答案: 使用挂钩状态时,您的测试必须忽略诸如状态之类的实现细节,以便对其进行正确测试。您仍然可以确保组件将正确的状态传递到其子级。 您可以在Kent C. Dodds撰写的这篇博客文章中找到一个很好的例子。 这是摘录的代码示例。 依赖状态执行细节的测试-
在不使用类的情况下,如何在react的功能性无状态组件中使用PropTypes?
我试图使用来自另一组主机[etcd]的事实来配置一组主机[节点]。这是我的主机文件 请注意,组[etcd]不是供应的目标,[nodes]是。但是提供[节点]需要了解[etcd]的事实。 当我运行这个playbook时,我得到控制台输出 使etcd事实对节点播放可用的惯用Ansible方法是什么?