Я пытаюсь реализовать концепцию микро-интерфейса. Для этого у меня будут следующие react
приложения.
- Контейнер
- Заголовок
- Панель инструментов
Все 3 являются отдельными приложениями. Header
и Dashboard
- я хотел бы использовать его в приложении Container
.
Для приложения Header
это простой react
функциональный компонент. Я использую следующие в webpack.config.js
.
output: {
path: path.join(__dirname, '/dist'),
filename: 'header-bundle.js',
library: 'TestHeader',
libraryTarget: 'umd'
},
В package.json
:
"main": "dist/header-bundle.js",
"peerDependencies": {
"react": "16.12.0"
},
"devDependencies": {
"@babel/cli": "^7.8.3",
"@babel/core": "^7.8.3",
"@babel/preset-env": "^7.8.3",
"@babel/preset-react": "^7.8.3",
"babel-loader": "^8.0.6",
"html-webpack-plugin": "^3.2.0",
"react": "^16.12.0",
"react-dom": "^16.12.0",
"webpack": "^4.41.5",
"webpack-cli": "^3.3.10",
"webpack-dev-server": "^3.10.1"
}
В Container
приложение: - npm link Header
В App.js
компонент Container
:
import React from 'react';
import Header from 'header-app';
const App = props => {
return (
<div>
<Header content="Header via container"></Header>
</div>
);
};
export default App;
Это прекрасно работает.
Но когда я добавьте Dashboard
компонент, который использует react hooks
, я получаю сообщение об ошибке неверного вызова ловушки.
Dashboard
приложение также имеет react
как peerDependencies
. Индивидуально Dashboard
приложение работает отлично.
Dashboard
компонент:
import React, { useState, useEffect } from 'react';
import NoIcon from './no_icon.png';
const Card = props => {
return (
<div style={{ margin: '1em' }}>
<img alt="avatar" style={{ width: '70px' }} src={NoIcon} />
<div>
<div style={{ fontWeight: 'bold' }}>{props.label}</div>
</div>
</div>
);
};
const CardList = props => {
return (
<div
style={{
display: 'grid',
gridTemplateColumns: 'repeat(3, auto)'
}}
>
{props.cards.map(card => (
<Card {...card} key={card.id} />
))}
</div>
);
};
const Dashboard = props => {
// const { apps } = props;
const [hasError, setErrors] = useState(false);
const [apps, setApps] = useState([]);
async function fetchData() {
const res = await fetch('src/data.json');
res
.json()
.then(res => setApps(res))
.catch(err => setErrors(err));
}
useEffect(() => {
fetchData();
}, []);
return (
<div>
<CardList cards={apps} />
</div>
);
};
export default Dashboard;
У меня есть несколько вопросов здесь:
- Как я могу использовать несколько
react
приложений в одном react
приложении? - Экспорт всего приложения
react
как отдельного компонента в виде библиотеки umd
и правильное использование его в другом приложении ? - Как я могу устранить эту ошибку
react
hooks? Как react
as peerDependencies
работает в библиотеке и в приложении, где он используется?