I use vue3 composition API and <script setup>
.
<textarea v-model="textarea"></textarea>
<button @click="showPreview">click</button>
<p ref="p" v-if="open"></p>
const textarea = ref("");
const p = ref(null);
const open = ref(false);
function showPreview() {
let text = textarea.value.replaceAll(/\n/g, "<br>");
if (p.value) { // p is null
p.value.innerHTML = text;
}
open.value = true;
}
I want to show textarea's text in p
tag(not using v-html) when click button.
But p
is null in function...
I tried check p variable in onMounted function but it still null.
onMounted(() => console.dir(p))
How can I access ref element when click event?
Thanks in advance for any help.
CodePudding user response:
Use v-show
so that the element is in the DOM even when not displayed. With v-if
, the <p>
element is not rendered when open
is false, so the ref is null
.
<p ref="p" v-show="open"></p>
However, you should consider using a ref
to store the text to display instead of working with the actual HTML elements. You can use the <pre>
element to preserve whitespace without needing to replace linebreaks with <br>
.
<template>
<textarea v-model="textarea"></textarea>
<button @click="showPreview">click</button>
<pre v-if="result">{{result}}</pre>
</template>
<script setup>
import {ref} from 'vue';
const textarea = ref("");
const result = ref("");
function showPreview() {
result.value = textarea.value;
}
</script>
CodePudding user response:
One way to display "raw" HTML is to use the v-html
directive as per the