Мимическое текстовое поле в div

используя React, я пытаюсь создать компонент для выделения текста.

Для этого у меня есть элемент textarea и div на одном уровне, копирующие значение textarea в div. Мой код ниже.

Текстовое поле находится внутри компонента TextArea, а div - внутри компонента HighlightedDiv.

Я только что обнаружил, что новые строки и пробелы не обрабатываются div так же, как в текстовом поле. Поэтому, когда я ввел несколько пробелов внутри текстового поля, div показывает только одно пространство. И когда я нажимаю Enter внутри текстового поля, текст в div остается в той же строке.

Где-то я обнаружил, что добавление этого к стилю CSS css для div исправляет следующее:

white-space: pre;

И это так, но теперь я также хочу, чтобы мой текст продолжал переноситься, когда он достигает границы div, как это происходит, когда я использую следующий css:

white-space: normal;
word-wrap: break-word;

Проблема, очевидно, в том, что мне нужны как white-space: pre, так и white-space: normal. Что, чтобы быть предельно ясным, невозможно.

Кто-нибудь знает другой способ достичь того, чего я хочу?

Мой код:

(Я использую библиотеку стилей s, стилизованные компоненты, поэтому элементы StyledTextArea и Div ниже представляют собой просто текстовое поле и div соответственно.)

HighlightTextArea (родительский):

import React, { Component } from 'react'
import styled from 'styled-components'

import HighlightDiv from './HighlightDiv'
import TextArea from './TextArea'

const Container = styled.div`
  border: 1px green solid;
  width: 100vh;
  padding: 20px;
`


export default class HighlightTextArea extends Component {
  constructor() {
    super()
    this.state = {
      text: ''
    }
  }
  setHighlightTextAreaState = (newStateObject) => {
    for (let key in newStateObject) {
      this.setState({ [key]: newStateObject[key] })
    }
  }
  render() {
    return (
      <Container>
        <TextArea setHighlightTextAreaState = {this.setHighlightTextAreaState}/>
        <HighlightDiv text = {this.state.text}/>
      </Container>
    );
  }
}

TextArea (Дочерний):

import React, { Component } from 'react'
import styled from 'styled-components'

const StyledTextArea = styled.textarea`
  border: 1px solid blue;
  font-family: 'Inconsolata', monospace;
  font-size: 1rem;
  width: 100%;
  height: 100%;
  padding: 0;
  margin: 0;
  position: absolute;
  top: 0;
  left: 0;
  z-index: 20;
  color: blue;
  opacity: 0.5;
`

export default class TextArea extends Component {
  constructor(props) {
    super(props)
  }
  handleChangeEvent = (event) => {
    console.info("TextArea.handleChangeEvent - event.target.value:")
    console.info("\"" + event.target.value + "\"")
    console.info("TextArea.handleChangeEvent - event.target.value.length: " + event.target.value.length)
    this.props.setHighlightTextAreaState({
      text: event.target.value,
    })
  }
  // componentDidMount() {
  //   let textAreaRect = document.getElementById("text-area").getBoundingClientRect()
  //
  // }
  render() {
    return (
      <StyledTextArea id = "text-area" onChange = {this.handleChangeEvent}></StyledTextArea>
    );
  }
}

HighlightDiv (Дочерний):

import React, { Component } from 'react'
import styled from 'styled-components'

const Div = styled.div`
  border: 1px solid red;
  font-family: 'Inconsolata', monospace;
  font-size: 1rem;
  width: 100%;
  height: 100%;
  padding: 0;
  margin: 0;
  position: absolute;
  top: 0;
  left: 0;
  z-index: 10;
  color: red;
  text-align: left;
  white-space: normal;
  word-wrap: break-word;
`


export default class HighlightDiv extends Component {
  constructor(props) {
    super(props)
  }
  renderTextHtml = () => {
    // Loop over all characters in this.props.text
    // Check if character is space or enter
  }
  render() {
    return (
      <Div>
        {this.props.text}
      </Div>
    )
  }
}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
314
1

Ответы 1

Вы должны использовать white-space: pre-wrap;

Фрагмент стека - бок о бок div / textarea

div {
  white-space: pre-wrap;
}


/* for the purpose of this demo */
div, textarea {
  display: inline-block;
  vertical-align: top;
  width: 220px;
  height: 220px;
  font-size: 16px;
  font-family: arial;
  overflow: hidden;
}
<div>But ere she from the church-door stepped She smiled and told us why:
  
    'It was a wicked woman's curse,' Quoth she, 'and what care I?'
     
She smiled, and smiled, and passed it off Ere from the door she stept
</div>

<textarea>But ere she from the church-door stepped She smiled and told us why:
  
    'It was a wicked woman's curse,' Quoth she, 'and what care I?'
     
She smiled, and smiled, and passed it off Ere from the door she stept
</textarea>

Отлично, это было быстро, но пока не могу выбрать ваш ответ в качестве ответа на свой вопрос. Придется подождать минут десять.

Rik Schoonbeek 04.07.2018 18:05

@RikSchoonbeek Не торопитесь :)

Ason 04.07.2018 18:14

Другие вопросы по теме