摘要:首先來看下的的實現(xiàn)組件,具名插槽定義以及默認(rèn)插槽提供內(nèi)容渲染的組件最終會渲染出已下架結(jié)構(gòu)言歸正傳,怎樣使用的實現(xiàn)的這一功能呢首先確認(rèn)下組件的結(jié)構(gòu)對此結(jié)構(gòu)輸出具體內(nèi)容的組件這里可能是一個頁面標(biāo)題主要內(nèi)容的一個段落。
首先來看下vue的slot的實現(xiàn)
提供內(nèi)容渲染的組件
Here might be a page title
A paragraph for the main content.
And another one.
Here"s some contact info
最終會渲染出已下架結(jié)構(gòu)
言歸正傳,怎樣使用react的context實現(xiàn)vue的這一功能呢 1 首先確認(rèn)下layout組件的結(jié)構(gòu)Here might be a page title
A paragraph for the main content.
And another one.
import React, { Component } from "react"; import SlotProvider from "./SlotProvider" import Slot from "./Slot" class AppLayout extends Component { static displayName = "AppLayout" render () { return (2 對此結(jié)構(gòu)輸出具體內(nèi)容的組件) } } export default SlotProvider(AppLayout)
import React, { Component } from "react"; import AppLayout from "./AppLayout" import AddOn from "./AddOn" export default class App extends Component { render() { return (3 其中AddOn類似于上面vue的template,所以下面來實現(xiàn)這個簡單的只是用來提供slot標(biāo)識和children內(nèi)容的組件AddOn的實現(xiàn)) } } 這里可能是一個頁面標(biāo)題
主要內(nèi)容的一個段落。
另一個段落。
這里有一些聯(lián)系信息
import React from "react"; import PropTypes from "prop-types" const AddOn = () => null AddOn.propTypes = { slot: PropTypes.string } AddOn.defaultTypes = { slot: "$$default" } AddOn.displayName = "AddOn" export default AddOn4 Slot組件
import React from "react"; import { SlotContext } from "./SlotProvider" import PropTypes from "prop-types" const Slot = ({ name, children }) => { return (5 接下來就是對Slot進行解析的HOC SlotProvider組件了{(value) => { const addOnRenderer = value.requestAddOnRenderer(name) return (addOnRenderer && addOnRenderer()) || children || null }} ) } Slot.displayName = "Slot" Slot.propTypes = { name: PropTypes.string } Slot.defaultProps = { name: "$$default" } export default Slot
import React, { Component } from "react"; function getDisplayName(component) { return component.displayName || component.name || "component" } export const SlotContext = React.createContext({ requestAddOnRenderer: () => { } }) const SlotProviderHoC = (WrappedComponent) => { return class extends Component { static displayName = `SlotProvider(${getDisplayName(WrappedComponent)})` // 用于緩存每個6 最終渲染結(jié)果的內(nèi)容 addOnRenderers = {} requestAddOnRenderer = (name) => { if (!this.addOnRenderers[name]) { return undefined } return () => ( this.addOnRenderers[name] ) } render() { const { children, ...restProps } = this.props if (children) { // 以k-v的方式緩存 的內(nèi)容 const arr = React.Children.toArray(children) const nameChecked = [] this.addOnRenderers = {} arr.forEach(item => { const itemType = item.type console.log("itemType",itemType) if (item.type.displayName === "AddOn") { const slotName = item.props.slot || "$$default" // 確保內(nèi)容唯一性 if (nameChecked.findIndex(item => item === slotName) !== -1) { throw new Error(`Slot(${slotName}) has been occupied`) } this.addOnRenderers[slotName] = item.props.children nameChecked.push(slotName) } }) } return ( ) } } } export default SlotProviderHoC
摘抄:張國鈺
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/54208.html
摘要:首先來看下的的實現(xiàn)組件,具名插槽定義以及默認(rèn)插槽提供內(nèi)容渲染的組件最終會渲染出已下架結(jié)構(gòu)言歸正傳,怎樣使用的實現(xiàn)的這一功能呢首先確認(rèn)下組件的結(jié)構(gòu)對此結(jié)構(gòu)輸出具體內(nèi)容的組件這里可能是一個頁面標(biāo)題主要內(nèi)容的一個段落。 首先來看下vue的slot的實現(xiàn) 組件,具名插槽name定義以及默認(rèn)插槽 提供內(nèi)容渲染的組件 ...
摘要:案例持續(xù)觸發(fā)事件時,并不立即執(zhí)行函數(shù),當(dāng)毫秒內(nèi)沒有觸發(fā)事件時,才會延時觸發(fā)一次函數(shù)。也以函數(shù)形式暴露普通插槽。這樣的場景組件用函數(shù)式組件是非常方便的。相關(guān)閱讀函數(shù)式組件自定義指令前言 有echarts使用經(jīng)驗的同學(xué)可能遇到過這樣的場景,在window.onresize事件回調(diào)里觸發(fā)echartsBox.resize()方法來達到重繪的目的,resize事件是連續(xù)觸發(fā)的這意味著echarts...
摘要:假如以的作用域鏈作為類比,組件提供的對象其實就好比一個提供給子組件訪問的作用域,而對象的屬性可以看成作用域上的活動對象。所以,我借鑒了作用域鏈的思路,把當(dāng)成是組件的作用域來使用。 前言 Context被翻譯為上下文,在編程領(lǐng)域,這是一個經(jīng)常會接觸到的概念,React中也有。 在React的官方文檔中,Context被歸類為高級部分(Advanced),屬于React的高級API,但官方...
摘要:結(jié)合我們的例子,子組件則會生成以下代碼到目前為止,對于普通插槽和作用域插槽已經(jīng)談的差不多了。下面我們將仔細(xì)談?wù)勥@塊的內(nèi)容。在看具體實現(xiàn)邏輯前,我們先通過一個例子來先了解下其基本用法然后進行使用頁面展示效果如下看著好。本篇文章是細(xì)談 vue 系列第二篇了,上篇我們已經(jīng)細(xì)談了 vue 的核心之一 vdom,傳送門 今天我們將分析我們經(jīng)常使用的 vue 功能 slot 是如何設(shè)計和實現(xiàn)的,本文將圍...
閱讀 2638·2021-11-25 09:43
閱讀 2739·2021-11-04 16:09
閱讀 1656·2021-10-12 10:13
閱讀 890·2021-09-29 09:35
閱讀 891·2021-08-03 14:03
閱讀 1784·2019-08-30 15:55
閱讀 3000·2019-08-28 18:14
閱讀 3502·2019-08-26 13:43