console
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<p>This is single-spa demo</p>
<div id="app"></div>
<button class="btn1">/</button>
<button class="btn2">/vue</button>
<button class="btn3">/react</button>
<script src="https://unpkg.com/vue@3.2.26/dist/vue.global.js"></script>
<script src="https://unpkg.com/react@17.0.2/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/mini-single-spa@latest/dist/mini-single-spa.iife.js"></script>
<script>
function $(selector) {
return document.querySelector(selector)
}
$('.btn1').onclick = () => {
location.hash = '/'
}
$('.btn2').onclick = () => {
location.hash = '/vue'
}
$('.btn3').onclick = () => {
location.hash = '/react'
}
let vueApp
MiniSingleSPA.registerApplication({
name: 'vue',
loadApp() {
return Promise.resolve({
async bootstrap() {
console.log('vue bootstrap')
},
async mount() {
console.log('vue mount')
vueApp = Vue.createApp({
data() {
return {
text: 'Vue App'
}
},
render() {
return Vue.h(
'div',
this.text
)
},
})
vueApp.mount('#app')
},
async unmount() {
console.log('vue unmount')
vueApp.unmount()
},
})
},
activeRule:(location) => location.hash === '#/vue',
customProps: {
container: $('#app')
}
})
class LikeButton extends React.Component {
constructor(props) {
super(props);
this.state = { liked: false };
}
render() {
if (this.state.liked) {
return 'You liked this.';
}
return React.createElement(
'button',
{ onClick: () => this.setState({ liked: true }) },
'Like'
);
}
}
MiniSingleSPA.registerApplication({
name: 'react',
loadApp() {
return Promise.resolve({
async bootstrap() {
console.log('react bootstrap')
},
async mount() {
console.log('react mount')
ReactDOM.render(
React.createElement(LikeButton),
$('#app')
);
},
async unmount() {
console.log('react unmount')
ReactDOM.unmountComponentAtNode($('#app'));
},
})
},
activeRule: (location) => location.hash === '#/react'
})
MiniSingleSPA.start()
</script>
</body>
</html>