0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

子コンポーネントにpropsで渡した文字列をウィンドウサイズによって改行させたりさせなかったりしたい

Last updated at Posted at 2024-06-19

課題

  • propsの文字列に<br>を含ませ、v-htmlで表示すれば解決するのは分かっていたが、XSSの危険性があるので使いたくなかった
  • propsの文字列に改行コード\nを含ませ、white-space: pre-wrapで改行させる方法も考えたが、半角スペースが入ってしてしまいデザインが崩れて困った

解決方法

window.innerWidthが768px以下になったとき、改行コードをreplaceする処理を子コンポーネントに入れた。

ChildComponent.vue
<template>
  <div class="text">{{ displayText }}</div>
</template>

<script setup lang="ts">
import { ref, onMounted, onBeforeUnmount, watch } from 'vue'

type Props = {
  text: string
}
const props = withDefaults(defineProps<Props>(), {
  text: ''
})
const displayText = ref('')

const handleResize = async () => {
  if (window.innerWidth >= 768) {
    displayText.value = props.text.replace('\n', '')
  } else {
    displayText.value = props.text
  }
}

onMounted(async () => {
  handleResize()
  window.addEventListener('resize', handleResize)
})

onBeforeUnmount(() => {
  window.removeEventListener('resize', handleResize)
})

watch(
  () => props.text,
  () => {
    handleResize()
  }
)
</script>

<style scoped lang="scss">
.text {
  white-space: pre-wrap;
}
</style>

所感

改行させたいだけなのになんだか複雑になってしまった😥
けっこう頻発しそうな問題な気がしますが、みなさまどうやって解決しているのでしょう。
なにかもっと良い方法がありましたら教えてほしいです。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?