摘要:首先來(lái)看下的的實(shí)現(xiàn)組件,具名插槽定義以及默認(rèn)插槽提供內(nèi)容渲染的組件最終會(huì)渲染出已下架結(jié)構(gòu)言歸正傳,怎樣使用的實(shí)現(xiàn)的這一功能呢首先確認(rèn)下組件的結(jié)構(gòu)對(duì)此結(jié)構(gòu)輸出具體內(nèi)容的組件這里可能是一個(gè)頁(yè)面標(biāo)題主要內(nèi)容的一個(gè)段落。
首先來(lái)看下vue的slot的實(shí)現(xiàn)
提供內(nèi)容渲染的組件
Here might be a page title
A paragraph for the main content.
And another one.
Here"s some contact info
最終會(huì)渲染出已下架結(jié)構(gòu)
言歸正傳,怎樣使用react的context實(shí)現(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 對(duì)此結(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,所以下面來(lái)實(shí)現(xiàn)這個(gè)簡(jiǎn)單的只是用來(lái)提供slot標(biāo)識(shí)和children內(nèi)容的組件AddOn的實(shí)現(xiàn)) } } 這里可能是一個(gè)頁(yè)面標(biāo)題
主要內(nèi)容的一個(gè)段落。
另一個(gè)段落。
這里有一些聯(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 接下來(lái)就是對(duì)Slot進(jìn)行解析的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)})` // 用于緩存每個(gè)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
摘抄:張國(guó)鈺
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/105754.html
摘要:首先來(lái)看下的的實(shí)現(xiàn)組件,具名插槽定義以及默認(rèn)插槽提供內(nèi)容渲染的組件最終會(huì)渲染出已下架結(jié)構(gòu)言歸正傳,怎樣使用的實(shí)現(xiàn)的這一功能呢首先確認(rèn)下組件的結(jié)構(gòu)對(duì)此結(jié)構(gòu)輸出具體內(nèi)容的組件這里可能是一個(gè)頁(yè)面標(biāo)題主要內(nèi)容的一個(gè)段落。 首先來(lái)看下vue的slot的實(shí)現(xiàn) 組件,具名插槽name定義以及默認(rèn)插槽 提供內(nèi)容渲染的組件 ...
摘要:案例持續(xù)觸發(fā)事件時(shí),并不立即執(zhí)行函數(shù),當(dāng)毫秒內(nèi)沒(méi)有觸發(fā)事件時(shí),才會(huì)延時(shí)觸發(fā)一次函數(shù)。也以函數(shù)形式暴露普通插槽。這樣的場(chǎng)景組件用函數(shù)式組件是非常方便的。相關(guān)閱讀函數(shù)式組件自定義指令前言 有echarts使用經(jīng)驗(yàn)的同學(xué)可能遇到過(guò)這樣的場(chǎng)景,在window.onresize事件回調(diào)里觸發(fā)echartsBox.resize()方法來(lái)達(dá)到重繪的目的,resize事件是連續(xù)觸發(fā)的這意味著echarts...
摘要:假如以的作用域鏈作為類比,組件提供的對(duì)象其實(shí)就好比一個(gè)提供給子組件訪問(wèn)的作用域,而對(duì)象的屬性可以看成作用域上的活動(dòng)對(duì)象。所以,我借鑒了作用域鏈的思路,把當(dāng)成是組件的作用域來(lái)使用。 前言 Context被翻譯為上下文,在編程領(lǐng)域,這是一個(gè)經(jīng)常會(huì)接觸到的概念,React中也有。 在React的官方文檔中,Context被歸類為高級(jí)部分(Advanced),屬于React的高級(jí)API,但官方...
摘要:結(jié)合我們的例子,子組件則會(huì)生成以下代碼到目前為止,對(duì)于普通插槽和作用域插槽已經(jīng)談的差不多了。下面我們將仔細(xì)談?wù)勥@塊的內(nèi)容。在看具體實(shí)現(xiàn)邏輯前,我們先通過(guò)一個(gè)例子來(lái)先了解下其基本用法然后進(jìn)行使用頁(yè)面展示效果如下看著好。本篇文章是細(xì)談 vue 系列第二篇了,上篇我們已經(jīng)細(xì)談了 vue 的核心之一 vdom,傳送門 今天我們將分析我們經(jīng)常使用的 vue 功能 slot 是如何設(shè)計(jì)和實(shí)現(xiàn)的,本文將圍...
閱讀 3611·2021-11-15 11:38
閱讀 2807·2021-11-11 16:55
閱讀 2558·2021-11-08 13:22
閱讀 2633·2021-11-02 14:45
閱讀 1314·2021-09-28 09:35
閱讀 2589·2021-09-10 10:50
閱讀 468·2019-08-30 15:44
閱讀 2783·2019-08-29 17:06