Arhn - архитектура программирования

Как получить доступ к стилям из React?

Я пытаюсь получить доступ к стилям ширины и высоты div в React, но столкнулся с одной проблемой. Это то, что я получил до сих пор:

componentDidMount()  {
  console.log(this.refs.container.style);     
}


render()  {
   return (
      <div ref={"container"} className={"container"}></div>  //set reff
   );
}

Это работает, но результат, который я получаю, представляет собой объект CSSStyleDeclaration, и в свойстве all я могу использовать все селекторы CSS для этого объекта, но ни один из них не установлен. Все они установлены в пустую строку.

Это вывод CSSStyleDecleration: http://pastebin.com/wXRPxz5p

Будем очень признательны за любую помощь в том, чтобы увидеть фактические стили (унаследованные от событий)!

Спасибо!


  • Попробуйте вместо этого использовать window.getComputedStyle(this.refs.container) 03.02.2016
  • ОМГ ДА!! Это сработало отлично... Это обычно используется? Потому что я никогда раньше не видел этого в React Docs EDIT: не могли бы вы дать ответ, чтобы я мог его принять 8) 03.02.2016
  • Это не функция React, и она может не работать в старом IE (‹=8). @Vikramaditya предложила лучшее решение. 03.02.2016
  • Я попробовал это и получил Cannot read property 'refs' of undefined 14.01.2019

Ответы:


1

Для React v ‹= 15

console.log( ReactDOM.findDOMNode(this.refs.container).style); //React v > 0.14

console.log( React.findDOMNode(this.refs.container).style);//React v <= 0.13.3

РЕДАКТИРОВАТЬ:

Для получения определенного значения стиля

console.log(window.getComputedStyle(ReactDOM.findDOMNode(this.refs.container)).getPropertyValue("border-radius"));// border-radius can be replaced with any other style attributes;

Для реакции v>= 16

назначьте ref, используя стиль обратного вызова или с помощью createRef().

assignRef = element => {
  this.container = element;
}
getStyle = () => {

  const styles = this.container.style;
  console.log(styles);
  // for getting computed styles
  const computed = window.getComputedStyle(this.container).getPropertyValue("border-radius"));// border-radius can be replaced with any other style attributes;
  console.log(computed);
}
03.02.2016
  • Является ли React.findDOMNode устарелым? 23.06.2017
  • да, React.findDOMNode был там до версии 0.13.3. Теперь используйте ReactDOM для всех операций, связанных с DOM. 24.06.2017
  • Я думаю, что Дэн Абрамов говорит в проблеме Github, на которую я ссылался, что метод будет объявлен устаревшим, будь то React.findDOMNode или ReactDOM.findDOMNode. Из документации по ReactDOM.findDOMNode: для доступа к базовому узлу DOM. В большинстве случаев использование этого аварийного люка не рекомендуется, поскольку он пробивает абстракцию компонента. Дэн рекомендует вместо этого использовать ref. 24.06.2017
  • Добавить информацию об устаревании findDOMNode: это не работает с Jest тестовый рендерер (но refs поддерживают) (Дэн Абрамов: Нет планов поддерживать findDOMNode() в тестовом рендерере, потому что он не должен зависеть от React DOM, и нет способа реализовать его так, чтобы он не перерыв в будущем) 20.07.2017
  • findDOMNode устарел. я обновил ответ @CyberJunkie. 15.01.2019
  • Для React v›=16, как вы используете assignRef()? Когда я реализую это, я получаю TypeError: this.container не определен. Я попытался сделать ссылку на контейнер в конструкторе как this.container = React.createRef();, затем попытался вызвать его в моем компоненте класса как <button onClick={()=>this.getStyle()} ref={this.container}>test</button>, но затем получил другую ошибку типа: Window.getComputedStyle: аргумент 1 не реализует элемент интерфейса. 27.05.2020

  • 2

    Вот пример вычисления значения свойства CSS с помощью React Refs и метода .getComputedStyle:

    class App extends React.Component {
        constructor(props) {
            super(props)
            this.divRef = React.createRef()
        }
    
        componentDidMount() {
            const styles = getComputedStyle(this.divRef.current)
    
            console.log(styles.color) // rgb(0, 0, 0)
            console.log(styles.width) // 976px
        }
    
        render() {
            return <div ref={this.divRef}>Some Text</div>
        }
    }
    
    17.06.2019

    3

    Стоит отметить, что хотя ReactDOM.findDOMNode можно использовать сегодня, в будущем он будет объявлен устаревшим вместо ссылок обратного вызова.

    здесь Дэн Абрамов описывает причины отказа от использования findDOMNode, при этом предоставляя примеры того, как заменить использование ReactDOM.findDOMNode ссылками обратного вызова.

    Поскольку я видел, как пользователи SO расстраивались, когда в ответ была включена только ссылка, поэтому я приведу один из примеров, любезно предоставленных Дэном:

    найтиDOMNode(stringDOMRef)

    **Before:**
    
    class MyComponent extends Component {
      componentDidMount() {
        findDOMNode(this.refs.something).scrollIntoView();
      }
    
      render() {
        return (
          <div>
            <div ref='something' />
          </div>
        )
      }
    }
    **After:**
    
    class MyComponent extends Component {
      componentDidMount() {
        this.something.scrollIntoView();
      }
    
      render() {
        return (
          <div>
            <div ref={node => this.something = node} />
          </div>
        )
      }
    }
    
    15.05.2018
  • Ой! Я только что заметил, что это уже упоминалось в комментариях под принятым ответом. :П 15.05.2018
  • И, что бы это ни стоило, использовать refs стало еще проще, если вы работаете с функциональным компонентом и хуком useRef()! (reactjs.org/docs/hooks-reference.html#useref) 06.06.2019

  • 4

    Вы должны использовать метод ReactDOM.findDOMNode и работать оттуда. Вот код, который делает то, что вам нужно.

    var Hello = React.createClass({
    
    componentDidMount: function() {
      var elem = ReactDOM.findDOMNode(this.refs.container);
      console.log(elem.offsetWidth, elem.offsetHeight);    
    },
    
    render: function() {
       return (
          <div ref={"container"} className={"container"}>
            Hello world
          </div>
       );
    }
    });
    
    ReactDOM.render(
      <Hello name="World" />,
      document.getElementById('container')
    );
    

    jsFiddle

    03.02.2016

    5

    Вы уже получили стиль, причина, по которой свойства объекта CSSStyleDeclaration имеют так много пустых строковых значений, заключается в том, что это ссылка на внутренний стиль.

    Посмотрите, что произойдет, если вы внесете изменения, как показано ниже:

    <div ref={"container"} className={"container"} style={{ width: 100 }}></div>

    03.02.2016
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..