2016-11-25 4 views
0

Я пытаюсь получить высоту элемента через ref, используя React JS, но безуспешно.Почему я не могу получить элемент по ref в React

У меня есть что-то вроде этого:

render() { 
    let cars = carData.filterCars(this.props.carsToShow, this.props.filters); 
    return (
     <div> 
      <div className="carList"> 
       <div className="cars" ref="cars"> 
        {cars.map((car, i) => { 
         let carRef = "car-" + car.id; 
         return (
          <div ref={carRef} key={i}> 
           <div> 
            <div><img src={car.image_url} /></div> 
            <div className="carNameAndDesc"> 
             <div>{car.make} {car.model}</div> 
             <div>{car.price}</div> 
            </div> 
           </div> 
          </div> 
         ); 
         })} 
       </div> 
      </div> 

      <div ref="bigScreenDetails" className="bigScreenDetails"> 
       <div className="carDetailsBigScreen"> 
        <CarDetails carID={this.state.carID}/> 
       </div> 
      </div> 
     </div> 
    ); 
} 

И в componentDidMount я пытаюсь сделать это следующим образом:

componentDidMount(){ 
    let carRef = "car-" + this.props.carID; //22 
    let refs = this.refs[carRef].offsetHeight; //undefined 
    let refs1 = this.refs["cars"].offsetHeight; //900 
    let refs2 = this.refs["bigScreenDetails"].offsetHeight; //1400 
} 

Я не могу получить реф в DIV внутри карты. Только для этого ref я получаю undefined, для других ссылок я получаю правильные значения.

Любые идеи?

console.log (carRef) внутри визуализации возвращается

"car-20" 
"car-21" 
"car-22" 
....... 
"car-35" 

И console.log (carRef) внутри componentDidMount возвращает

"car-22" 

Но если я console.log(this.refs) в componentDidMount я получаю:

enter image description here

Таким образом, onl y два refs insted из трех.

UPDATE

Как будто не существует абсолютно никаких ссылок внутри

{cars.map((car, i) => { 
        let carRef = "car-" + car.id; 
        return (
         <div ref={carRef} key={i}> 

         </div> 
        ); 
        })} 

Вот лог консоли:

let carRef = "car-" + carID; 
    let refs = this.refs; 
    let one = ReactDOM.findDOMNode(this.refs[carRef]); 
    let two = this.carRefs; 

    console.log("All refs : " + refs); 
    console.log("Vikramaditya : " + one); 
    console.log("Tom : " + two); 

В первом console.log я должен видеть все три рефов , но я вижу только два из них.

enter image description here

+0

ваша car.id приходит из БД? Это может означать, что это int, а не строка, что означает, что this.refs [carRef] действительно возвращает это: «автомобиль» 22 –

+0

@usedToBeFat Я проверил его. Это «автомобиль-22». – Boky

+0

В вашем способе рендеринга разрешите carRef = "car-" + car.id; можете ли вы зарегистрировать этот carRef и посмотреть, что он возвращает? –

ответ

2

В идеале, избегать использования рефов в первую очередь ...

Если вы потребность использовать их по какой-то причине, я бы рекомендовал использовать стиль обратного вызова. Это позволит вам использовать ссылки на сами элементы, а не вмешиваться со строками.

Глядя на the docs, я даже не уверен, поддерживаются ли строка рефов больше ...

Если я вас были (и я определенно был уверен, что мне нужно все эти рефов) Я хотел бы сделать что-то вроде это:

cars.map(car => (
    <div ref={ref => this.carRefs[car.id] = ref} key={car.id}> 
    </div> 
)) 

В конструкторе, вы можете назначить this.carRefs = {};.

Теперь вы можете получить доступ к своим автомобилям в объекте this.carRefs изнутри componentDidMount.

class TestComponent extends React.Component { 
 
    constructor() { 
 
     super(); 
 
     this.carRefs = {}; 
 
    } 
 

 
    componentDidMount() { 
 
     console.log(this.carRefs); 
 
    } 
 

 
    render() { 
 
     return (<div> 
 
      {this.props.cars.map(({id}) => 
 
      <div key={id} ref={ref => this.carRefs[id] = ref}></div>)} 
 
     </div>); 
 
    } 
 
} 
 
     
 
const cars = [{id: 1}, {id: 2}]; 
 
ReactDOM.render(<TestComponent cars={cars} /> , document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
 

 
<div id="root"></div>

+0

Что я пытаюсь сделать, так это получить offsetTop div с этим ref. Есть ли лучший способ сделать это? У меня есть ползунок в родительском компоненте с фотографиями автомобиля, и я передаю идентификатор автомобиля этому дочернему компоненту onClick. А затем в дочернем компоненте я хочу получить offsetTop автомобиля с этим id, чтобы иметь возможность прокручивать его, если компонент установлен. – Boky

+1

Если вам нужно получить позицию элементов DOM, это звучит как действительное использование для ссылок. –

+0

Да, мне нужно, чтобы получить положение элементов. Я собираюсь попробовать ваше решение. – Boky

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