【问题标题】:Why I can't get element by ref in React为什么我不能在 React 中通过 ref 获取元素
【发布时间】:2017-04-10 01:23:41
【问题描述】:

我正在尝试使用 React JS 通过 ref 获取元素高度,但没有成功。

我有这样的事情:

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 的引用。只有那个参考我得到未定义,对于其他参考我得到正确的值。

有什么想法吗?

console.log(carRef) 内部渲染返回

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

console.log(carRef) 里面 componentDidMount 返回

"car-22"

但如果我在 componentDidMount 中 console.log(this.refs) 我会得到:

因此只有两个 refsed 三个。

更新

好像里面绝对没有ref

{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 中,我应该看到所有三个 ref,但我只看到其中两个。

【问题讨论】:

  • 你的 car.id 来自 db 吗?这可能意味着它是一个 int 而不是一个字符串,这意味着 this.refs[carRef] 实际上正在返回 this: 'car' 22
  • @usedToBeFat 我检查了它。它是"car-22"
  • 在你的渲染方法中让 carRef = "car-" + car.id;你能记录下这个 carRef 并查看它返回的内容吗?
  • 我更新了我的问题。

标签: javascript reactjs


【解决方案1】:

理想情况下,首先避免使用 refs...

如果您出于某种原因需要使用它们,我建议使用回调样式。这将允许您使用对元素本身的引用,而不是乱用字符串。

看着the docs,我什至不确定是否再支持字符串引用...

如果我是你(我确信我需要所有这些参考),我会做这样的事情:

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

在您的构造函数中,您可以分配this.carRefs = {};

现在您可以从componentDidMount 内部的this.carRefs 对象中访问您的汽车。

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>

【讨论】:

  • 我想要做的是用那个 ref 获取 div 的 offsetTop。有没有更好的方法呢?我在父组件中有一个带有汽车照片的滑块,我将汽车 ID 传递给这个子组件的 onClick 事件。然后在子组件中,我想获取具有该 ID 的汽车的 offsetTop,以便在安装组件时能够滚动到它。
  • 如果您需要获取 DOM 元素的位置,那么这听起来像是对 refs 的有效使用。
  • 是的,我需要它来获取元素的位置。我要试试你的解决方案。
  • 我们应该遵循@TomFenech 的建议,但如果您仍想使用旧方式,您可以使用ReactDOM.findDOMNode(this.refs[carRef]).offsetHeight;
  • @Vikramaditya 问题是我无法在 cars.map() 中获取 div 的引用。就像它根本不存在一样。 Tom Fenech 解决方案也存在同样的问题。我已经更新了我的问题。
猜你喜欢
  • 1970-01-01
  • 2020-10-12
  • 2016-07-19
  • 2019-07-18
  • 1970-01-01
  • 1970-01-01
  • 2020-07-23
  • 2014-07-09
  • 2017-07-12
相关资源
最近更新 更多