React之React.cloneElement
<p><img src="https://img2020.cnblogs.com/blog/1602094/202010/1602094-20201028093119141-1988924635.png"></p><p> </p>
<p>如果把一个页面分为多个组件组成的话(组件多层嵌套),</p>
<p>想要在<span style="color: rgba(0, 0, 255, 1)">Panel</span>和<span style="color: rgba(0, 0, 255, 1)">Calendar</span>之间传值就不能用以往的props属性了。</p>
<p>解决方法:</p>
<p>Panel.js</p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
</span><Form.Root className={`bg-white ${type === <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">reading</span><span style="color: rgba(128, 0, 0, 1)">'</span> ? <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">reading-min-height</span><span style="color: rgba(128, 0, 0, 1)">'</span> : <span style="color: rgba(128, 0, 0, 1)">''</span>}`}>
<div className=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">panel-title</span><span style="color: rgba(128, 0, 0, 1)">"</span>>
<h4 className=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">webfont</span><span style="color: rgba(128, 0, 0, 1)">"</span>>
<span className={<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">topTitle</span><span style="color: rgba(128, 0, 0, 1)">"</span>}>{<span style="color: rgba(0, 0, 255, 1)">this</span>.props.title}</span>
</h4><span style="color: rgba(0, 0, 0, 1)">
{type </span>=== <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">reading</span><span style="color: rgba(128, 0, 0, 1)">"</span> ? <a className=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">rightFont</span><span style="color: rgba(128, 0, 0, 1)">"</span> onClick={() => <span style="color: rgba(0, 0, 255, 1)">this</span>.onOpenTabs()}>更多></a> : <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">}
{workDay </span>?
<Popover placement=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">bottom</span><span style="color: rgba(128, 0, 0, 1)">"</span> content=<span style="color: rgba(0, 0, 0, 1)">{
</span><div style={{display: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">flex</span><span style="color: rgba(128, 0, 0, 1)">'</span>, flexDirection: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">column</span><span style="color: rgba(128, 0, 0, 1)">'</span>, justifyContent: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">center</span><span style="color: rgba(128, 0, 0, 1)">'</span>}}>
<Button type=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">primary</span><span style="color: rgba(128, 0, 0, 1)">"</span> onClick={() => <span style="color: rgba(0, 0, 255, 1)">this</span>.showMadel(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">2</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)}
style</span>={{marginBottom: <span style="color: rgba(128, 0, 128, 1)">10</span>}}>便笺</Button>
<Button type=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">primary</span><span style="color: rgba(128, 0, 0, 1)">"</span> onClick={() => <span style="color: rgba(0, 0, 255, 1)">this</span>.showMadel(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">1</span><span style="color: rgba(128, 0, 0, 1)">'</span>)}>日程</Button>
</div><span style="color: rgba(0, 0, 0, 1)">
}
title</span>=<span style="color: rgba(128, 0, 0, 1)">""</span>>
<a className=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">more</span><span style="color: rgba(128, 0, 0, 1)">"</span>>
<i className=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">iconfont iconxinzengricheng mr-1</span><span style="color: rgba(128, 0, 0, 1)">"</span>/><span style="color: rgba(0, 0, 0, 1)">新建
</span></a>
</Popover><span style="color: rgba(0, 0, 0, 1)">
: </span><span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">}
</span><<span style="color: rgba(0, 0, 0, 1)">Modal
width</span>={window.innerWidth * <span style="color: rgba(128, 0, 128, 1)">0.7</span><span style="color: rgba(0, 0, 0, 1)">}
style</span>=<span style="color: rgba(0, 0, 0, 1)">{{
top: </span><span style="color: rgba(128, 0, 128, 1)">30</span><span style="color: rgba(0, 0, 0, 1)">
}}
title</span>=<span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">
visible</span>=<span style="color: rgba(0, 0, 0, 1)">{visible}
onOk</span>={<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.handleOk}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> confirmLoading={confirmLoading}</span>
okText=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">ok</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
footer</span>={<span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">}
onCancel</span>={<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.handleCancel}
</span>>
<div id=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">pannelDialog</span><span style="color: rgba(128, 0, 0, 1)">"</span>><span style="color: rgba(0, 0, 0, 1)">
{CreateTitle(title)}
{createInput()}
</span><div>
<div className=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">input-group mt-3 mb-3</span><span style="color: rgba(128, 0, 0, 1)">"</span>>
<div className=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">input-group-prepend</span><span style="color: rgba(128, 0, 0, 1)">"</span>>
<div>{types === <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(128, 0, 0, 1)">'</span> ? attachments.length > <span style="color: rgba(128, 0, 128, 1)">0</span> ? <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">查看图片:</span><span style="color: rgba(128, 0, 0, 1)">'</span> : <span style="color: rgba(128, 0, 0, 1)">''</span> : <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">上传图片:</span><span style="color: rgba(128, 0, 0, 1)">'</span>}</div>
</div>
</div><span style="color: rgba(0, 0, 0, 1)">
{types </span>=== <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(128, 0, 0, 1)">'</span> ? attachments.length > <span style="color: rgba(128, 0, 128, 1)">0</span> ?
<ImageUploader width={<span style="color: rgba(128, 0, 128, 1)">80</span>} height={<span style="color: rgba(128, 0, 128, 1)">80</span>} attachments={attachments} types=<span style="color: rgba(0, 0, 0, 1)">{types}
pushAttachments</span>={<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.pushAttachments}
removeAttachments</span>={<span style="color: rgba(0, 0, 255, 1)">this</span>.removeAttachments}/> : <span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)"> :
</span><ImageUploader width={<span style="color: rgba(128, 0, 128, 1)">80</span>} height={<span style="color: rgba(128, 0, 128, 1)">80</span>} attachments={attachments} types=<span style="color: rgba(0, 0, 0, 1)">{types}
pushAttachments</span>={<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.pushAttachments}
removeAttachments</span>={<span style="color: rgba(0, 0, 255, 1)">this</span>.removeAttachments}/><span style="color: rgba(0, 0, 0, 1)">}
</span></div><span style="color: rgba(0, 0, 0, 1)">
{CreateButton(</span><span style="color: rgba(0, 0, 255, 1)">this</span>.submit, <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.hideMadel, types)}
</span></div>
</Modal>
</div><span style="color: rgba(0, 0, 0, 1)">
{</span><span style="color: rgba(0, 0, 255, 1)">this</span>.props.children && React.cloneElement(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.props.children, {
handleClick: </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.postValue,
onRef: </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.onRef,
})}
</span></Form.Root><span style="color: rgba(0, 0, 0, 1)">
);</span></pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/1602094/202010/1602094-20201028094341167-28822789.png"></p>
<p> </p>
<p> </p>
<p>使用React.cloneElement(this.props)来渲染子元素,使用第二个参数props来传值</p>
<p> </p><br><br>
来源:https://www.cnblogs.com/it-Ren/p/13889336.html
頁:
[1]