如何正确处理 React 道具
How to handle React props correctly
我在这里发布这篇文章是因为我对 React 比较陌生,不知道我到底应该做什么 google。在我的 React 项目中,我有一个 kendo 网格,其中有一个名为 OPTIONS 的自定义列,如下所示:
<Grid onDataStateChange={onDataStateChange}
data={result}
{...{skip:0, take:13}}>
<GridColumn cell={CommandCell} title="Options"/>
<GridColumn field="session_id" title="Session" filter='text'/>
<GridColumn field="sn_zag_id" title="Service" filter='text'/>
Option列定义如下:
const [visible2, setVisible2] = useState(false);
const [snZagId, setSnZagId] = useState();
const toggleDialogPrilog = (props) => {
setVisible2(!visible2);
setSnZagId(props.dataItem.sn_zag_id)
}
const CommandCell = (props) => <Options {...props}/>
const Options= (props) => {
return <td className="k-command-cell">
<div style={{marginTop:'2%'}}>
<Button style={{width:'8vw',marginTop:'2%'}}
onClick={()=>toggleDialogPrilog(props)}>
Add
</Button></>}
</div>
{ visible2 &&
<Dialog onClose={()=> toggleDialogPrilog()} title={"Add"} style={{width:'50%'}}>
<Prilog snZagId={snZagId}/>
</Dialog>
}
</td>;}
因此,在选项列中,我有一个添加按钮,单击该按钮时,会打开一个对话框,其中包含 PRILOG 组件。我所说的网格很大,由 13 行的页面组成。一切正常,所以当我单击“添加”按钮时,对话框打开,该行带有自定义 material。但问题是,如果我打开 console/inspect,我可以看到当我点击添加时,同时打开了 13 个对话框:
我在某种程度上知道,当我单击“添加”时,所有对话框都会呈现,因为我发送了道具,但我不知道如何停止它。换句话说,我如何修改我的代码,以便在我单击“添加”时只打开一个 (1) 个对话框?
我设法以某种方式解决了问题,但我不知道到底有什么区别。我没有将 Options 组件放在同一个 jsx 文件中,而是创建了另一个名为 SessionOptions 的组件,如下所示:
Session.jsx:
import SessionOptions from '../../Popup/SesijaOpcije';
...
const CommandCell = (props) => <SessionOptions props={props}/>;
...
SessionOptions.jsx:
...
export default function SessionOptions({props}) {
...
return <td className="k-command-cell">
<div style={{marginTop:'2%'}}>
<Button style={{width:'8vw',marginTop:'2%'}}
onClick={()=>toggleDialogPrilog(props)}>
Add
</Button></>}
</div>
{ visible2 &&
<Dialog onClose={()=> toggleDialogPrilog()} title={"Add"} style={{width:'50%'}}>
<Prilog snZagId={snZagId}/>
</Dialog>
}
</td>;}
现在它只打开一个对话框。我清楚地看到的唯一区别是发送道具
//Before:
const CommandCell = (props) => <Options {...props}/>
//After:
const CommandCell = (props) => <SessionOptions props={props}/>;
第一个是属性展开符号,第二个是...?谁能解释一下区别。
如果有人可以澄清更多。
我在这里发布这篇文章是因为我对 React 比较陌生,不知道我到底应该做什么 google。在我的 React 项目中,我有一个 kendo 网格,其中有一个名为 OPTIONS 的自定义列,如下所示:
<Grid onDataStateChange={onDataStateChange}
data={result}
{...{skip:0, take:13}}>
<GridColumn cell={CommandCell} title="Options"/>
<GridColumn field="session_id" title="Session" filter='text'/>
<GridColumn field="sn_zag_id" title="Service" filter='text'/>
Option列定义如下:
const [visible2, setVisible2] = useState(false);
const [snZagId, setSnZagId] = useState();
const toggleDialogPrilog = (props) => {
setVisible2(!visible2);
setSnZagId(props.dataItem.sn_zag_id)
}
const CommandCell = (props) => <Options {...props}/>
const Options= (props) => {
return <td className="k-command-cell">
<div style={{marginTop:'2%'}}>
<Button style={{width:'8vw',marginTop:'2%'}}
onClick={()=>toggleDialogPrilog(props)}>
Add
</Button></>}
</div>
{ visible2 &&
<Dialog onClose={()=> toggleDialogPrilog()} title={"Add"} style={{width:'50%'}}>
<Prilog snZagId={snZagId}/>
</Dialog>
}
</td>;}
因此,在选项列中,我有一个添加按钮,单击该按钮时,会打开一个对话框,其中包含 PRILOG 组件。我所说的网格很大,由 13 行的页面组成。一切正常,所以当我单击“添加”按钮时,对话框打开,该行带有自定义 material。但问题是,如果我打开 console/inspect,我可以看到当我点击添加时,同时打开了 13 个对话框:
我在某种程度上知道,当我单击“添加”时,所有对话框都会呈现,因为我发送了道具,但我不知道如何停止它。换句话说,我如何修改我的代码,以便在我单击“添加”时只打开一个 (1) 个对话框?
我设法以某种方式解决了问题,但我不知道到底有什么区别。我没有将 Options 组件放在同一个 jsx 文件中,而是创建了另一个名为 SessionOptions 的组件,如下所示:
Session.jsx:
import SessionOptions from '../../Popup/SesijaOpcije';
...
const CommandCell = (props) => <SessionOptions props={props}/>;
...
SessionOptions.jsx:
...
export default function SessionOptions({props}) {
...
return <td className="k-command-cell">
<div style={{marginTop:'2%'}}>
<Button style={{width:'8vw',marginTop:'2%'}}
onClick={()=>toggleDialogPrilog(props)}>
Add
</Button></>}
</div>
{ visible2 &&
<Dialog onClose={()=> toggleDialogPrilog()} title={"Add"} style={{width:'50%'}}>
<Prilog snZagId={snZagId}/>
</Dialog>
}
</td>;}
现在它只打开一个对话框。我清楚地看到的唯一区别是发送道具
//Before:
const CommandCell = (props) => <Options {...props}/>
//After:
const CommandCell = (props) => <SessionOptions props={props}/>;
第一个是属性展开符号,第二个是...?谁能解释一下区别。 如果有人可以澄清更多。