2017-01-14 2 views
2

фонПередача переменных между компонентами в React.js

Я пытаюсь передать css class имя в variable называется styling к моему className на tr элемента. Я думаю, что моя проблема здесь в том, что мне еще предстоит понять концепцию props.

В принципе у меня есть component написанный в ES6, и я хочу, чтобы изменить css class из tr на основе стоимости child td.

Проблема

С моим текущим кодом я получаю

стиль не определен

Но это делает console.log все нужные css class так, я знаю, что все это хорошо минус фактическое class добавлено к className из тега tr. По какой-то причине он не пропускает переменную внутри от componentDidMount до render.

Вопрос

Пожалуйста, объясните мне, как пройти variables на протяжении всей моей React.jscomponent/components?

Пример

class TableDisplay extends React.Component{ 
        constructor(props) { 
        super(props); 
       } 
       componentDidMount() { 
        var styling = " "; 
       var tCells = document.getElementsByTagName("td"); 
       for (var i = 0; i < tCells.length; i++) { 
         if(tCells[i].innerHTML == "Approved") { 
         console.log("bg-success"); 
         styling = "bg-success"; 
        } else if (tCells[i].innerHTML == "Denied") { 
         console.log("bg-danger"); 
         styling = "bg-danger"; 
        } else { 
         console.log("bg-plain"); 
         styling = "bg-plain"; 
        } 
       } 
       } 
      render() { 
       return <div><table className="table"> 
         <tr className="seperate"><td>Title</td><td>Status</td><td>Created</td><td>Updated</td><td>Delete</td></tr> 
         {Object.keys(requests).map(function(key) { 
// Problem appears to be here 
          return <tr className={styling}> 
           <td>{requests[key].title}</td> 
           <td>{requests[key].status}</td> 
           <td>{requests[key].created_at.slice(0, 10)}</td> 
           <td>{requests[key].updated_at.slice(0, 10)}</td> 
           <td><a href="">Delete</a></td> 
           </tr>; 

             })} 
        </table> 
        </div>; 
      } 
    } 

, что я пытался

я думаю, что это может быть сфера или закрытия проблемы. Поэтому я попробовал.

Global

Создание стилизации глобальной переменной. Это не сработало.

Это

Пытались использовать this.styling. Это тоже не сработало.

перемещена Внутри Рендер

я переехал цикл внутри визуализации. Когда я это сделал, он добавил переменную стиля в className, но только первое начальное объявление styling = " ";. Так что в основном это просто сделало каждый tr пространства для className.

+0

Используется ли ваш текст «Утвержденный» и «Отказано» от запросов [key] .status или запросов [key] .title? Если это так, вы пытались переместить его внутри функции рендеринга, но сравнивали с этими переменными вместо innerHTML? –

+0

Я попытался переместить его. В нижней части моего вопроса я объясню результат. В принципе, если я удаляю стиль из классаName, он запускает приложение и выводит на консоль все правильные данные. Но когда я перемещаю цикл внутри рендеринга, он просто добавляет пробел в пятне className для каждого тега tr – wuno

ответ

1

Предполагая, что ваш текст «Утвержден» и «Отказано» от requests[key].status. не можете ли вы просто сделать что-то вроде этого:

{Object.keys(requests).map(function(key) { 
    let styling = "bg-plain"; 

    if (requests[key].status === "Approved") { 
     styling = "bg-success"; 
    } else if (requests[key].status === "Denied") { 
     styling = "bg-danger"; 
    } 

    return <tr className={styling}> 
     <td>{requests[key].title}</td> 
     <td>{requests[key].status}</td> 
     <td>{requests[key].created_at.slice(0, 10)}</td> 
     <td>{requests[key].updated_at.slice(0, 10)}</td> 
     <td><a href="">Delete</a></td> 
    </tr>; 

})} 
+0

Спасибо lol. Иисус человек. Я трачу так много времени, пытаясь понять, как работает область действия, я застекляю прямо над очевидным. – wuno

+0

Должен признаться. Я все еще беспокоюсь, почему я не могу получить объем или реквизит для работы. Если у вас есть какой-либо вклад в это, дайте мне знать. – wuno

+0

@wuno Из вашего «примера на основе ответа». Я вижу, почему 'this.state.styling' не определен. Поскольку вы не используете функцию стрелок ES6 в качестве обратного вызова, ваша переменная 'this' не находится во внешней области. Из ES5 людям нравится иметь «var self = this» вне, а затем использовать «self.state.foo» в обратном вызове. Возможно, вам стоит взглянуть на это: http://jsrocks.org/2014/10/arrow-functions-and-their-scope/ для этой прекрасной функции стрелок. –

0

Вы должны использовать state в своем компоненте, чтобы получить доступ к этим переменным, которые изменяются в разное время в течение lifecycle компонента.

При создании TableDisplay установить начальное состояние в конструкторе следующим образом:

class TableDisplay extends React.Component{ 
    constructor(props) { 
    super(props); 
    this.state = {styling: ""}; 
    } 

и на основе условной в вашей componentDidMount функции над изменением этого состояния с помощью функции setState следующим образом:

this.setState({ styling: "what ever you want to change it to"}); 

и получите доступ к этому статуту с помощью this.state.styling в вашей функции render следующим образом:

<tr className={this.state.styling}> 

Причина, по которой ваша функция render не может использовать переменную styling, потому что она не в той же области. После того, как componentDidMount было выполнено, переменная styling исчезла. Таким образом, состояние React позволяет вам получать доступ к переменным во всем компоненте.

+0

. Я обновил свой вопрос, используя ваше объяснение. Пожалуйста, взгляните на нижнюю часть моего вопроса и скажите мне, что я делаю то, что вы предложили. Я получаю состояние не определено – wuno

Смежные вопросы