2019-12-11 23:37:03 +08:00
|
|
|
<script src="../../../../node_modules/marked/marked.min.js"></script>
|
|
|
|
<script src="../../../../node_modules/lodash/lodash.min.js"></script>
|
2019-12-03 04:22:04 +08:00
|
|
|
<script src="../../dist/vue.global.js"></script>
|
|
|
|
|
|
|
|
<div id="editor">
|
|
|
|
<textarea :value="input" @input="update"></textarea>
|
|
|
|
<div v-html="output"></div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<script>
|
2019-12-11 23:37:03 +08:00
|
|
|
const delay = window.location.hash === '#test' ? 16 : 300
|
2019-12-03 04:22:04 +08:00
|
|
|
const { ref, computed } = Vue
|
|
|
|
|
|
|
|
const App = {
|
|
|
|
setup() {
|
|
|
|
const input = ref('# hello')
|
|
|
|
const output = computed(() => marked(input.value, { sanitize: true }))
|
2019-12-11 23:37:03 +08:00
|
|
|
const update = _.debounce(e => { input.value = e.target.value }, delay)
|
2019-12-03 04:22:04 +08:00
|
|
|
|
|
|
|
return {
|
|
|
|
input,
|
|
|
|
output,
|
|
|
|
update
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Vue.createApp().mount(App, '#editor')
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<style>
|
|
|
|
html, body, #editor {
|
|
|
|
margin: 0;
|
|
|
|
height: 100%;
|
|
|
|
font-family: 'Helvetica Neue', Arial, sans-serif;
|
|
|
|
color: #333;
|
|
|
|
}
|
|
|
|
|
|
|
|
textarea, #editor div {
|
|
|
|
display: inline-block;
|
|
|
|
width: 49%;
|
|
|
|
height: 100%;
|
|
|
|
vertical-align: top;
|
|
|
|
-webkit-box-sizing: border-box;
|
|
|
|
-moz-box-sizing: border-box;
|
|
|
|
box-sizing: border-box;
|
|
|
|
padding: 0 20px;
|
|
|
|
}
|
|
|
|
|
|
|
|
textarea {
|
|
|
|
border: none;
|
|
|
|
border-right: 1px solid #ccc;
|
|
|
|
resize: none;
|
|
|
|
outline: none;
|
|
|
|
background-color: #f6f6f6;
|
|
|
|
font-size: 14px;
|
|
|
|
font-family: 'Monaco', courier, monospace;
|
|
|
|
padding: 20px;
|
|
|
|
}
|
|
|
|
|
|
|
|
code {
|
|
|
|
color: #f66;
|
|
|
|
}
|
|
|
|
</style>
|