Comunicación del componente padre-hijo
// 导入
import {
useState } from "react";
import "./App.scss";
import {
defaultTodos } from "./components/module/contentData";
// 子组件
const Module = ({
id, done, text, onToggle, onDelData }) => {
return (
<div>
<span className={
done ? "" : "text"} onClick={
() => onToggle(id)}>
-- {
text} --
</span>
{
/* 点击后子组件调用父组件函数,将 id 回传给父组件 */}
<button onClick={
() => onDelData(id)}>删除</button>
</div>
);
};
// 父组件
const App = () => {
// 状态
const [defaultTodo, setDefaultTodo] = useState(defaultTodos);
// 修改文字状态
const onToggle = (id) => {
setDefaultTodo(
defaultTodo.map((item) => {
if (item.id === id) return {
...item, done: !item.done };
return item;
})
);
console.log(defaultTodo);
};
// 删除
const onDelData = (xId) => {
const dataId = defaultTodo.filter((item) => item.id !== parseInt(xId));
console.log(xId, "点击了删除", dataId);
setDefaultTodo(dataId);
};
return (
<div>
<p>xxx </p>
{
defaultTodo.map((item) => {
// key 可以直接用
// return <Module key={item.id} done={item.done} text={item.text}></Module>;
// {...item} 解构写法,简化开发
// onToggle 给子组件调用的函数
return (
<Module
key={
item.id}
{
...item}
onToggle={
onToggle}
onDelData={
onDelData}
></Module>
);
})}
</div>
);
};
export default App;
Este código incluye un componente principal App
y un componente secundario Module
, que realiza la comunicación entre los componentes principal e secundario.
En el componente principal App
, useState
un estado se define usando defaultTodo
e inicializado en defaultTodos
. defaultTodos
es ./components/module/contentData
una lista de tareas pendientes predeterminada importada desde un archivo.
App
onToggle
Se definen dos funciones de devolución de llamada en el componente onDelData
, que se utilizan para cambiar el estado del elemento pendiente y eliminar el elemento pendiente respectivamente.
El componente secundario recibe Module
los parámetros pasados por el componente principal id
,,, y . En el componente secundario, use estos parámetros para mostrar el contenido y el estado de la tarea pendiente, y llame a la función de devolución de llamada pasada por el componente principal a través del evento de clic para modificar el estado o eliminar la tarea pendiente.done
text
onToggle
onDelData
En App
el componente, defaultTodo.map
se recorre la matriz defaultTodo
y los datos de cada tarea pendiente Module
se representan como una propiedad del componente secundario.
El componente principal y el componente secundario se comunican a través de la función de devolución de llamada, y el componente secundario pasa los datos o la actualización del estado llamando a la función de devolución de llamada pasada por el componente principal. Al mismo tiempo, el componente principal useState
gestiona los cambios de estado a través de y setDefaultTodo
actualiza el estado llamando a funciones.
En términos de estilos CSS, los archivos import "./App.scss"
se importan App.scss
y span
se agregan diferentes efectos de estilo mediante representación condicional en los elementos de los subcomponentes.
En general, este código demuestra la comunicación entre los componentes padre e hijo en React a través de accesorios y funciones de devolución de llamada para realizar las funciones de visualización, cambio de estado y eliminación de la lista de tareas pendientes.
Pasar valor entre componentes hermanos
import {
useState } from "react";
import "./App.scss";
import From from "./components/ContentData";
import List from "./components/TitleData";
// 利用转态提升来让兄弟组件之间可以传值
function App() {
const [data, setData] = useState([
{
id: 1, name: "李白", age: 19 },
{
id: 2, name: "杜甫", age: 29 },
{
id: 3, name: "白居易", age: 30 },
]);
const addListData = (newData) => {
console.log("执行了");
setData([...data, {
id: Date.now(), name: newData, age: 119 }]);
};
return (
<div>
<From data={
data}></From>
<hr />
<List addListData={
addListData}></List>
</div>
);
}
export default App;
Listar código de subcomponente:
import {
List } from "antd";
const ListData = ({
data }) => {
return (
<div>
<List
size="large"
header={
<div>唐</div>}
footer={
<div>宋</div>}
bordered
dataSource={
data}
renderItem={
(item) => <List.Item>{
item.name}</List.Item>}
/>
</div>
);
};
export default ListData;
Del código del subcomponente:
import {
ProForm, ProFormText } from "@ant-design/pro-components";
import "./index.css";
const From = ({
addListData }) => {
return (
<div className="box-form">
<ProForm
onFinish={
async (values) => {
console.log(values);
addListData(values.name);
}}
>
<ProFormText name="name" label="姓名" />
</ProForm>
</div>
);
};
export default From;
Este código incluye un componente principal App
y dos componentes secundarios From
y List
realiza la transferencia de valor entre componentes hermanos .
En el componente principal App
, useState
un estado se define utilizando data
e inicializa como una matriz de tres objetos. El componente principal también define una addListData
función denominada , que se utiliza para data
agregar nuevos datos a la matriz.
Los componentes principales pasan data
estados y addListData
funciones a componentes y funciones secundarios como From
accesorios List
. El componente secundario From
recibe addListData
la función y cuando ProForm
el valor en el formulario cambia y se envía el formulario, addListData
se llama a la función para agregar el nuevo valor al data
estado del componente principal.
Los componentes secundarios List
reciben data
como accesorios y utilizan los datos en List
la presentación de componentes de Ant Design.data
La transferencia de valor entre el componente principal y el componente secundario se realiza a través de accesorios. El componente principal pasa el estado y las funciones al componente secundario como accesorios. El componente secundario afecta el estado del componente principal llamando a la función pasada por el componente principal.
El propósito de toda la aplicación es permitir al usuario From
ingresar un dato a través del formulario en el componente y luego List
mostrar los datos ingresados a través del componente. El componente principal App
actúa como intermediario, pasando datos y funciones entre componentes hermanos.
Los subcomponentes pueden utilizar los datos o funciones pasados por el componente principal para lograr las funciones correspondientes de acuerdo con sus propias funciones y necesidades, y realizar la transferencia de valor y la interacción entre los componentes hermanos.
pasar valor entre componentes
import {
createContext, useState } from "react";
import ContentData from "./components/ContentData";
import TitleData from "./components/TitleData";
export const ThemeContext = createContext();
const App = () => {
const [color, setcolor] = useState("#bfc");
// 无视组件层级关系,跨组件通信
const editColor = (e) => {
console.log("触发");
setcolor(e);
};
return (
<div>
{
/* 共享数据 */}
<ThemeContext.Provider value={
color}>
<p>123</p>
<ContentData></ContentData>
<hr />
<TitleData editColor={
editColor}></TitleData>
</ThemeContext.Provider>
</div>
);
};
export default App;
Subcomponente TitleData:
const TitleData = ({
editColor }) => {
const triggeredChange = (e) => {
console.log(e.nativeEvent.srcElement.value);
editColor(e.nativeEvent.srcElement.value);
};
return (
<div className="box-form">
子组件:<p>TitleData</p>
<input type="color" onChange={
(e) => triggeredChange(e)} />
</div>
);
};
export default TitleData;
Subcomponente ContentData:
import {
useContext } from "react";
import GrandsonModule from "./components/grandsonModule";
import {
ThemeContext } from "../../App";
const ContentData = ({
data }) => {
const theme = useContext(ThemeContext);
return (
<div>
子组件:<p style={
{
color: theme }}>ContentData {
theme}</p>
<GrandsonModule></GrandsonModule>
</div>
);
};
export default ContentData;
GrandsonModule es el componente descendiente:
GrandsonModule es un subcomponente del subcomponente ContentData
import {
useContext } from "react";
import {
ThemeContext } from "../../../App";
const GrandsonModule = () => {
const theme = useContext(ThemeContext);
return (
<div>
子孙组件:<p>GrandsonModule {
theme}</p>
</div>
);
};
export default GrandsonModule;
Este código demuestra cómo utilizar Context para compartir datos entre componentes.
En App
el componente, primero se createContext
crea un objeto de contexto usando una función ThemeContext
. Luego, use useState
para definir un estado color
con un valor inicial de "#bfc"
. El valor que actualizará setcolor
la función color
.
En editColor
una función, el valor setcolor
que se actualiza llamando a la función color
. Esta función TitleData
se llama en el componente secundario para actualizar el estado del componente principal.
En la declaración, coloque return
los datos que deben compartirse en el atributo en . De esta manera, todos los componentes del paquete pueden acceder a estos datos compartidos. En este ejemplo, componentes secundarios y valores accesibles .color
<ThemeContext.Provider>
value
ThemeContext.Provider
ContentData
TitleData
color
Los subcomponentes ContentData
utilizan useContext
ganchos para suscribirse al ThemeContext
contexto y theme
variables para obtener el valor de los datos compartidos color
. En return
una declaración, se muestra un fragmento de texto que contiene un valor theme
.
El componente secundario GrandsonModule
también usa useContext
el gancho para obtener color
el valor y muestra theme
un fragmento de texto que contiene el valor.
El componente secundario TitleData
recibe la función pasada por el componente principal y llama a la función editColor
en el caso del cuadro de entrada para actualizar el estado del componente principal.onChange
editColor