爱党爱国 發表於 2020-10-28 09:54:00

React之React.cloneElement

<p><img src="https://img2020.cnblogs.com/blog/1602094/202010/1602094-20201028093119141-1988924635.png"></p>
<p>&nbsp;</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>&lt;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>}`}&gt;
                &lt;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>&gt;
                  &lt;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>&gt;
                        &lt;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>}&gt;{<span style="color: rgba(0, 0, 255, 1)">this</span>.props.title}&lt;/span&gt;
                  &lt;/h4&gt;<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> ? &lt;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={() =&gt; <span style="color: rgba(0, 0, 255, 1)">this</span>.onOpenTabs()}&gt;更多&gt;&lt;/a&gt; : <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">}

                  {workDay </span>?
                        &lt;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>&lt;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>}}&gt;
                              &lt;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={() =&gt; <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>}}&gt;便笺&lt;/Button&gt;
                              &lt;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={() =&gt; <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>)}&gt;日程&lt;/Button&gt;
                            &lt;/div&gt;<span style="color: rgba(0, 0, 0, 1)">
                        }
                                 title</span>=<span style="color: rgba(128, 0, 0, 1)">""</span>&gt;
                            &lt;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>&gt;
                              &lt;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>/&gt;<span style="color: rgba(0, 0, 0, 1)">新建
                            </span>&lt;/a&gt;
                        &lt;/Popover&gt;<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>&lt;<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>&gt;
                        &lt;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>&gt;<span style="color: rgba(0, 0, 0, 1)">
                            {CreateTitle(title)}
                            {createInput()}
                            </span>&lt;div&gt;

                              &lt;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>&gt;
                                    &lt;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>&gt;
                                        &lt;div&gt;{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 &gt; <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>}&lt;/div&gt;
                                    &lt;/div&gt;
                              &lt;/div&gt;<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 &gt; <span style="color: rgba(128, 0, 128, 1)">0</span> ?
                                    &lt;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}/&gt; : <span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)"> :
                                    </span>&lt;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}/&gt;<span style="color: rgba(0, 0, 0, 1)">}
                            </span>&lt;/div&gt;<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>&lt;/div&gt;
                  &lt;/Modal&gt;
                &lt;/div&gt;<span style="color: rgba(0, 0, 0, 1)">
                {</span><span style="color: rgba(0, 0, 255, 1)">this</span>.props.children &amp;&amp; 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>&lt;/Form.Root&gt;<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>&nbsp;</p>
<p>&nbsp;</p>
<p>使用React.cloneElement(this.props)来渲染子元素,使用第二个参数props来传值</p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/it-Ren/p/13889336.html
頁: [1]
查看完整版本: React之React.cloneElement