It is need that when the button is pressed, it immediately turns red,
and in the second tab the value
changes to true. To do this, you need to rerender the parent component.
The option that is used works only once, but it should work for everyone.
import React from 'react';
import type { CollapseProps } from 'antd';
import { Collapse, Button, Space } from 'antd';
import { useState } from "react";
let value1 = false;
let value2 = false;
let value3 = false;
const Element1 = (props: any) => {
const handleClick = (key: number) => {
if (key == 1) {
value1 = true
}
else if (key == 2) {
value2 = true
}
else {
value3 = true
}
props.callBack(true);
}
return (
<div>
<div>
<Space >
<Button
onClick={() => handleClick(1)}
color={!value1 ? "primary" : "danger"}
variant="solid"
>Button1
</Button>
<Button
onClick={() => handleClick(2)}
color={!value2 ? "primary" : "danger"}
variant="solid"
>Button2
</Button>
<Button
onClick={() => handleClick(3)}
color={!value3 ? "primary" : "danger"}
variant="solid"
>Button3
</Button>
</Space>
</div>
</div>
);
}
const Element2 = () => {
return (
<div>
<div>
<p>value1 <b>{value1.toString()}</b></p>
<p>value2 <b>{value2.toString()}</b></p>
<p>value3 <b>{value3.toString()}</b></p>
</div>
</div>
);
}
const CollapseComponent: React.FC = () => {
const [ , setReload] = useState(false);
const items: CollapseProps['items'] = [
{
key: '1',
label: 'Element1',
children: <Element1 callBack={setReload} />
},
{
key: '2',
label: 'Element2',
children: <Element2 />
}
];
return (
<Collapse items={items} />
);
};
export default CollapseComponent;
The solution turned out to be very simple. A hook was added to the parent component, which was passed to the child. There it changes, which causes the parent to be rerender.
import React from 'react';
import type { CollapseProps } from 'antd';
import { Collapse, Button, Space } from 'antd';
import { useState } from "react";
let value1 = false;
let value2 = false;
let value3 = false;
interface Props {
counter: number;
setCounter: (key: number) => void;
}
const Element1 = ({ counter, setCounter }: Props) => {
const handleClick = (key: number) => {
if (key == 1) {
value1 = true
console.log('value1 ', value1.toString())
}
else if (key == 2) {
value2 = true
console.log('value2 ', value2.toString())
}
else {
value3 = true
console.log('value3 ', value3.toString())
}
counter++; // change the hook
setCounter(counter) // set new value
}
return (
<div>
<div>
<Space >
<Button
onClick={() => handleClick(1)}
color={!value1 ? "primary" : "danger"}
variant="solid"
>Button1
</Button>
<Button
onClick={() => handleClick(2)}
color={!value2 ? "primary" : "danger"}
variant="solid"
>Button2
</Button>
<Button
onClick={() => handleClick(3)}
color={!value3 ? "primary" : "danger"}
variant="solid"
>Button3
</Button>
</Space>
</div>
</div>
);
}
const Element2 = () => {
return (
<div>
<div>
<p>value1 <b>{value1.toString()}</b></p>
<p>value2 <b>{value2.toString()}</b></p>
<p>value3 <b>{value3.toString()}</b></p>
</div>
</div>
);
}
const CollapseComponent: React.FC = () => {
const [counter, setCounter] = useState<number>(0); // new hook
const items: CollapseProps['items'] = [
{
key: '1',
label: 'Element1',
// pass to child
children: <Element1 counter={counter} setCounter={setCounter} />
},
{
key: '2',
label: 'Element2',
children: <Element2 />
}
];
return (
<div>
<Collapse items={items} />
</div>
);
};
export default CollapseComponent;