React-toastify 显示多个吐司
React-toastify showing multiple toast
我正在构建一个包含多个组件的 React 应用程序,其中至少有一半我正在使用 React-notify
并且它在几乎所有组件中都可以正常工作,除了一个。在这一个中,当我触发吐司时,我得到了四个吐司,一个在另一个之后,但我相信它们不是不同的吐司,因为它们具有相同的 ID。
我找到了这个帖子https://github.com/fkhadra/react-toastify/issues/182,这里的用户遇到了和我一样的问题,唯一的例外是我没有设置autoclose
,他甚至提供了一个显示问题的gif:
根据此线程的解决方案是删除所有 <ToastContainer />
组件并将其呈现在应用程序根目录中,在我的例子中是 App.js
。我做到了,但是祝酒词不再显示了,不过我不知道我做得对不对。
除此之外,我还尝试设置自定义 ID,但没有任何改变。
我正在使用 React-router-dom
,也许这在某些方面有影响,我找不到合适的答案,也没有在任何其他来源的文档中找到。
这是我的App.js
的简化版本:
import Layout from './containers/Layout/Layout';
import { ToastContainer } from 'react-toastify';
import 'react-toastify/dist/ReactToastify.css';
import { BrowserRouter, Route, Switch } from 'react-router-dom';
class App extends Component {
render() {
return (
<BrowserRouter>
<Layout>
<Switch>
<Route path="/clientes" exact component={ClientesControls} />
<Route path="/adm" exact component={AdmControls} />
<Route path="/" component={OrcConfig} />
<ToastContainer />
</Switch>
</Layout>
</BrowserRouter>
);
}
}
这是正在生成错误的组件示例:
import React from 'react';
import axios from '../../../axios';
import { toast } from 'react-toastify';
const listarProdutosItens = props => {
const excluirItemHandler = i => {
let key = props.listaItens[i].key
let categoria = props.listaItens[i].categoria
axios.delete(`/adm/${categoria}/${key}.json`)
.then(res => {
props.fetchLista()
notify('excluído')
})
.catch(error => notify('não excluído'))
}
const notify = (arg) => {
if (arg === 'excluído') {
toast.success('Produto removido com sucesso')
console.log('TESTE')
} else if (arg === 'não excluído') {
toast.error('Erro ao tentar remover produto')
}
}
return (
<div className="row border-bottom mt-2">
<button onClick={() => excluirItemHandler(i)} ></button>
{/* <ToastContainer /> */}
</div>
)
}
正常工作的组件具有相同的语法。
如有任何帮助,我们将不胜感激。
只需将 <ToastContainer />
移到 <Layout />
之外
将 <ToastContainer/>
移到 <Switch>
之外的任何位置,因为:
<Switch>
is unique in that it renders a route exclusively.
还有:
All children of a <Switch>
should be <Route>
or <Redirect>
elements. Only the first child to match the current location will be rendered.
在您添加了烤面包机逻辑的组件中导入吐司。给出如下:
import { toast } from 'react-toastify';
// avoid the ToastContainer to add here and the css as well
然后在您的应用程序的根目录:
import { ToastContainer } from 'react-toastify';
import 'react-toastify/dist/ReactToastify.css';
const CommonComponent = () => (
<div>
<ToastContainer />
<OtherComponent />
</div>
)
我遇到了同样的问题(我的已经在路由器之外了)。这可能无法解决根本问题,但对我有用的是添加自定义 toast id,即 change
toast.success('Produto removido com sucesso')
至
toast.success('Produto removido com sucesso', {
toastId: 'success1',
})
并且重复的 toasts 不再出现。
我正在构建一个包含多个组件的 React 应用程序,其中至少有一半我正在使用 React-notify
并且它在几乎所有组件中都可以正常工作,除了一个。在这一个中,当我触发吐司时,我得到了四个吐司,一个在另一个之后,但我相信它们不是不同的吐司,因为它们具有相同的 ID。
我找到了这个帖子https://github.com/fkhadra/react-toastify/issues/182,这里的用户遇到了和我一样的问题,唯一的例外是我没有设置autoclose
,他甚至提供了一个显示问题的gif:
根据此线程的解决方案是删除所有 <ToastContainer />
组件并将其呈现在应用程序根目录中,在我的例子中是 App.js
。我做到了,但是祝酒词不再显示了,不过我不知道我做得对不对。
除此之外,我还尝试设置自定义 ID,但没有任何改变。
我正在使用 React-router-dom
,也许这在某些方面有影响,我找不到合适的答案,也没有在任何其他来源的文档中找到。
这是我的App.js
的简化版本:
import Layout from './containers/Layout/Layout';
import { ToastContainer } from 'react-toastify';
import 'react-toastify/dist/ReactToastify.css';
import { BrowserRouter, Route, Switch } from 'react-router-dom';
class App extends Component {
render() {
return (
<BrowserRouter>
<Layout>
<Switch>
<Route path="/clientes" exact component={ClientesControls} />
<Route path="/adm" exact component={AdmControls} />
<Route path="/" component={OrcConfig} />
<ToastContainer />
</Switch>
</Layout>
</BrowserRouter>
);
}
}
这是正在生成错误的组件示例:
import React from 'react';
import axios from '../../../axios';
import { toast } from 'react-toastify';
const listarProdutosItens = props => {
const excluirItemHandler = i => {
let key = props.listaItens[i].key
let categoria = props.listaItens[i].categoria
axios.delete(`/adm/${categoria}/${key}.json`)
.then(res => {
props.fetchLista()
notify('excluído')
})
.catch(error => notify('não excluído'))
}
const notify = (arg) => {
if (arg === 'excluído') {
toast.success('Produto removido com sucesso')
console.log('TESTE')
} else if (arg === 'não excluído') {
toast.error('Erro ao tentar remover produto')
}
}
return (
<div className="row border-bottom mt-2">
<button onClick={() => excluirItemHandler(i)} ></button>
{/* <ToastContainer /> */}
</div>
)
}
正常工作的组件具有相同的语法。
如有任何帮助,我们将不胜感激。
只需将 <ToastContainer />
移到 <Layout />
将 <ToastContainer/>
移到 <Switch>
之外的任何位置,因为:
<Switch>
is unique in that it renders a route exclusively.
还有:
All children of a
<Switch>
should be<Route>
or<Redirect>
elements. Only the first child to match the current location will be rendered.
在您添加了烤面包机逻辑的组件中导入吐司。给出如下:
import { toast } from 'react-toastify';
// avoid the ToastContainer to add here and the css as well
然后在您的应用程序的根目录:
import { ToastContainer } from 'react-toastify';
import 'react-toastify/dist/ReactToastify.css';
const CommonComponent = () => (
<div>
<ToastContainer />
<OtherComponent />
</div>
)
我遇到了同样的问题(我的已经在路由器之外了)。这可能无法解决根本问题,但对我有用的是添加自定义 toast id,即 change
toast.success('Produto removido com sucesso')
至
toast.success('Produto removido com sucesso', {
toastId: 'success1',
})
并且重复的 toasts 不再出现。