ReactDom createPortal() 不起作用但 render() 起作用,并且只有在重复触发时才会起作用 - 这是为什么?
ReactDom createPortal() doesn't work but render() does, and only once not if trigger is repeated - why is this?
新手在这里反应。
TLDR:我有一个名为 createNotification
的辅助函数,调用时使用 render() 将 <ToastNotification />
组件插入到 container
元素中。如果我使用 createPortal() ,则不会附加任何内容。如果我使用渲染,尽管有多个触发器,组件只添加一次。
谁能帮我弄清楚发生了什么事?
谢谢
helpers.js
import { ToastNotification } from "carbon-components-react";
import { render, createPortal } from "react-dom";
export const createNotification = () => {
const container = document.getElementById("notificationContainer");
console.log(container); //just to check function is running and has found container
return render(<ToastNotification />, container); //works but only once, not on multiple triggers
return createPortal(<ToastNotification />, container); //doesn't render anything in container
};
上面的函数根据需要从其他组件调用:
login.js
import { createNotification } from "../../helpers";
const Login = () => {
const validateLogin = async (event) => {
createNotification();
// validation logic
performLogin();
};
const performLogin = async () => {
//axios call here
};
// main component content
return (
<>
<!-- validateLogin() called on form submit -->
</>
);
};
export default Login;
app.js
//imports
function App() {
return (
<div>
<div className="App"></div>
</div>
);
}
export default App;
谢谢
通过在 render()
.
中添加 createPortal()
自己解决了这个问题
如果有人能提供解释,将不胜感激。
export const createNotification = () => {
const container = document.getElementById("notificationContainer");
console.log(container);
return render(createPortal(<ToastNotification />, container), document.createElement("div"));
};
createNotification 未安装在虚拟应用程序的组件中 Dom...当您使用 render(createPortal) 时,您只需创建 spearted 应用程序。
import { createNotification } from "../../helpers";
export const createNotification = () => {
const container = document.getElementById("notificationContainer");
console.log(container); //just to check function is running and has found container
return createPortal(<ToastNotification />, container); //doesn't render anything in container
};
const Login = () => {
const [validate, setValidate] = useState(false);
const validateLogin = async (event) => {
if('some logic')
return setValidte(true)
setVAlidte(false)
};
useEffect(() => {
if(!valite)
return;
//axios heare
}, [validate])
// main component content
return (
<>
{!validate && <CreateNotfication/>}
<!-- validateLogin() called on form submit -->
</>
);
};
新手在这里反应。
TLDR:我有一个名为 createNotification
的辅助函数,调用时使用 render() 将 <ToastNotification />
组件插入到 container
元素中。如果我使用 createPortal() ,则不会附加任何内容。如果我使用渲染,尽管有多个触发器,组件只添加一次。
谁能帮我弄清楚发生了什么事?
谢谢
helpers.js
import { ToastNotification } from "carbon-components-react";
import { render, createPortal } from "react-dom";
export const createNotification = () => {
const container = document.getElementById("notificationContainer");
console.log(container); //just to check function is running and has found container
return render(<ToastNotification />, container); //works but only once, not on multiple triggers
return createPortal(<ToastNotification />, container); //doesn't render anything in container
};
上面的函数根据需要从其他组件调用:
login.js
import { createNotification } from "../../helpers";
const Login = () => {
const validateLogin = async (event) => {
createNotification();
// validation logic
performLogin();
};
const performLogin = async () => {
//axios call here
};
// main component content
return (
<>
<!-- validateLogin() called on form submit -->
</>
);
};
export default Login;
app.js
//imports
function App() {
return (
<div>
<div className="App"></div>
</div>
);
}
export default App;
谢谢
通过在 render()
.
createPortal()
自己解决了这个问题
如果有人能提供解释,将不胜感激。
export const createNotification = () => {
const container = document.getElementById("notificationContainer");
console.log(container);
return render(createPortal(<ToastNotification />, container), document.createElement("div"));
};
createNotification 未安装在虚拟应用程序的组件中 Dom...当您使用 render(createPortal) 时,您只需创建 spearted 应用程序。
import { createNotification } from "../../helpers";
export const createNotification = () => {
const container = document.getElementById("notificationContainer");
console.log(container); //just to check function is running and has found container
return createPortal(<ToastNotification />, container); //doesn't render anything in container
};
const Login = () => {
const [validate, setValidate] = useState(false);
const validateLogin = async (event) => {
if('some logic')
return setValidte(true)
setVAlidte(false)
};
useEffect(() => {
if(!valite)
return;
//axios heare
}, [validate])
// main component content
return (
<>
{!validate && <CreateNotfication/>}
<!-- validateLogin() called on form submit -->
</>
);
};