Skip to content

Commit d719805

Browse files
committed
feat[ptr]: React 通过 props.children 实现 Vue 插槽功能
具名插槽区分 1. 直接传对象 2. 函数对象属性 3. 直接传递一个 render 函数 => ( JSX )
1 parent 7340fa1 commit d719805

5 files changed

Lines changed: 65 additions & 6 deletions

File tree

React/sandboxs/src/App.jsx

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import React from 'react';
2+
3+
import CoverButton from './test/CoverButton';
4+
5+
const el = (
6+
// 写在 组件中间{ }中的 会自动传入到 props.children
7+
<CoverButton>
8+
{{
9+
default: <h1>default</h1>,
10+
extra: <div>extra</div>
11+
}}
12+
</CoverButton>
13+
)
14+
15+
16+
const App = () => el
17+
export default App
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import React from 'react'
2+
3+
function Layout({ children }) {
4+
return <div>{children}</div>;
5+
}
6+
7+
Layout.Header = function Header({ children }) {
8+
return <header>{children}</header>;
9+
};
10+
11+
Layout.Footer = function Footer({ children }) {
12+
return <footer>{children}</footer>;
13+
};
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import React from 'react'
2+
import Layout from './Layout'
3+
4+
export default () => (
5+
<Layout>
6+
<Layout.Header>
7+
<h1>Header</h1>
8+
</Layout.Header>
9+
10+
<div>Main</div>
11+
12+
<Layout.Footer>
13+
<p>Footer</p>
14+
</Layout.Footer>
15+
</Layout>
16+
)

React/sandboxs/src/index.js

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import ReactDOM from 'react-dom';
2323
// </>
2424
// )
2525

26-
import StateInEvent from './test/StateInEvent';
2726

2827
// import { Btn, MyBtn } from './test/Event';
2928

@@ -51,10 +50,12 @@ import StateInEvent from './test/StateInEvent';
5150
// </>
5251
// )
5352

54-
import AppOldLifeCylcle from './test/AppOldLifeCylcle'
53+
// import AppOldLifeCylcle from './test/AppOldLifeCylcle'
5554

56-
const el = (
57-
<AppOldLifeCylcle />
58-
)
55+
// const el = (
56+
// <AppOldLifeCylcle />
57+
// )
58+
59+
import App from './App'
5960

60-
ReactDOM.render(el, document.getElementById('root'))
61+
ReactDOM.render(<App />, document.getElementById('root'))
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import React from 'react'
2+
3+
function CoverButton(props) {
4+
return (
5+
<div>
6+
<button>{props.children.default}</button>
7+
<h1>{props.children.extra}</h1>
8+
</div>
9+
)
10+
}
11+
12+
export default CoverButton

0 commit comments

Comments
 (0)