建议:使用 useImperativeHandle hook 代替 ref callback
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 35/100
- Tipo de issue
- Nueva funcionalidad
- Claridad
- Bastante claro
- Estado de actividad
- Estancado
- Stack tecnológico
- react, typescript
- Área
- frontend
Línea de trabajo
Comience por el punto de entrada Notification.newInstance existente y el class-component ref callback descrito en el issue. Compare el flujo propuesto de forwardRef/useImperativeHandle y verifique que add devuelve una clave de forma síncrona, que remove la acepta y que destroy sigue desmontando el contenedor.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
背景
为了能在普通 JavaScript 函数中调用 <Notification ref={ref} /> 组件实例的方法,目前是通过 class component 的 ref callback 机制实现的,但因为依赖异步回调,导致上层 API 的使用也深受回调影响,如果可以通过某种方式同步获得组件的控制权,那么在 API 使用和封装上会变得优雅很多:
const instance = Notification.newInstance();
const key = instance.add({title: 'xxx'}); // 可以同步返回 key
instance.remove(key);
我们可以通过 useImperativeHandle hook 结合 ref 转发来实现此需求。
大致思路:
- 使用 Function Component 改写 Notification 组件
- Notification 组件通过 useImperativeHandle hook 和 forwardRef 暴露内部 add 和 remove 方法
- Notification.newInstance 通过 createRef 并把 ref.current 同步返回,这样就可以实现同步调用了
const Notification = React.forwardRef((props, ref) => {
const [notices, setNotices] = useState([]);
const add = notice => {
// add notice
};
const remove = key => {
// remove notice
};
// expose add & remove methods
useImperativeHandle(ref, () => ({
add,
remove,
}));
return (
<div>{noticeNodes}</div>
);
});
Notification.newInstance = function newNotificationInstance(properties) {
const ref = React.createRef();
// append container stuff....
ReactDOM.render(<ToastHub {...props} ref={ref} />, div);
return {
notice: noticeProps => ref.current.add(noticeProps),
removeNotice: key => ref.current.remove(key),
component: ref.current,
destroy() {
ReactDOM.unmountComponentAtNode(div);
div.parentNode.removeChild(div);
},
};
}
- Lenguaje dominante
- TypeScript
- Estrellas
- 384
- Forks
- 118
- Merge medio
- 1 h 18 min
- PR fusionados (30 d)
- 2
Guía de contribución
No hay ninguna guía de contribución indexada para este repositorio
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de react-component/notification
-
Notification上不存在属性“newInstance” Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 45/100
react-component/notification#382 ·
-
为什么RcNotification是undefined Abierto
Dificultad 3/5 1-2 días Aptitud para principiantes 25/100
react-component/notification#356 · 2 comentarios ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 42/100
react-component/notification#333 ·
-
项目里如何只在一处地方添加`contextHolder` Abierto
Dificultad 3/5 1-2 días Aptitud para principiantes 25/100
react-component/notification#307 ·
-
谷歌标签页休眠导致maxCount属性失效 Abierto
Dificultad 3/5 1-2 días Aptitud para principiantes 48/100
react-component/notification#305 ·
Todos los issues de react-component/notification
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
mksglu/context-mode#1200 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
jaegertracing/jaeger-ui#4506 ·
-
area:desktop area:ui bug platform:macos
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
anthropics/claude-code#96687 ·
-
good first issue
Dificultad 1/5 Menos de una hora Aptitud para principiantes 95/100
AOSSIE-Org/DebateAI#582 · 2 comentarios ·