国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

使用react context 實現vue插槽slot功能

2024-05-06 15:36:52
字體:
來源:轉載
供稿:網友

首先來看下vue的slot的實現

<base-layout>組件,具名插槽name定義以及默認插槽

<div class="container"> <header>  <slot name="header"></slot> </header> <main>  <slot></slot> </main> <footer>  <slot name="footer"></slot> </footer></div><template>

提供內容渲染的組件

<base-layout> <template v-slot:header>  <h1>Here might be a page title</h1> </template> <p>A paragraph for the main content.</p> <p>And another one.</p> <template v-slot:footer>  <p>Here's some contact info</p> </template></base-layout>

最終會渲染出已下架結構

<base-layout> <template v-slot:header>  <h1>Here might be a page title</h1> </template> <p>A paragraph for the main content.</p> <p>And another one.</p> <template v-slot:footer>  <p>Here's some contact info</p> </template></base-layout>

言歸正傳,怎樣使用react的context實現vue的這一功能呢

1 首先確認下layout組件的結構

import React, { Component } from 'react';import SlotProvider from './SlotProvider'import Slot from './Slot'class AppLayout extends Component { static displayName = 'AppLayout' render () {  return (   <div className="container">    <header>     <Slot name="header"></Slot>    </header>    <main>     <Slot></Slot>    </main>    <footer>     <Slot name="footer"></Slot>    </footer>   </div>  ) }}export default SlotProvider(AppLayout)

2 對此結構輸出具體內容的組件

import React, { Component } from 'react';import AppLayout from './AppLayout'import AddOn from './AddOn'export default class App extends Component {  render() {    return (      <AppLayout>        <AddOn slot="header">          <h1>這里可能是一個頁面標題</h1>        </AddOn>        <AddOn>          <p>主要內容的一個段落。</p>          <p>另一個段落。</p>        </AddOn>        <AddOn slot="footer">          <p>這里有一些聯系信息</p>        </AddOn>      </AppLayout>    )  }}

3 其中AddOn類似于上面vue的template,所以下面來實現這個簡單的只是用來提供slot標識和children內容的組件AddOn的實現

import React from 'react';import PropTypes from 'prop-types'const AddOn = () => nullAddOn.propTypes = { slot: PropTypes.string }AddOn.defaultTypes = { slot: '$$default' }AddOn.displayName = 'AddOn'export default AddOn

4 Slot組件

import React from 'react';import { SlotContext } from './SlotProvider'import PropTypes from 'prop-types'const Slot = ({ name, children }) => { return (  <SlotContext.Consumer>   {(value) => {    const addOnRenderer = value.requestAddOnRenderer(name)     return (addOnRenderer && addOnRenderer()) || children || null   }}  </SlotContext.Consumer> )}Slot.displayName = 'Slot'Slot.propTypes = { name: PropTypes.string }Slot.defaultProps = { name: '$$default' }export default Slot            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 牟定县| 白河县| 彭泽县| 改则县| 楚雄市| 响水县| 通道| 崇文区| 顺昌县| 杭锦后旗| 灵川县| 浦城县| 林州市| 新闻| 涪陵区| 邵武市| 章丘市| 名山县| 崇礼县| 平谷区| 东方市| 祁门县| 建湖县| 西充县| 西乌珠穆沁旗| 秦安县| 临洮县| 苍南县| 沐川县| 东乌| 东山县| 临武县| 江孜县| 莲花县| 永州市| 政和县| 溧阳市| 宜黄县| 任丘市| 沂南县| 竹山县|