这是Javascript中eval()的正确用法吗?

Joe*_*e C 2 javascript eval reactjs

我已经浏览了https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval

我很好奇是否有更好的方法将当前点击的面板名称传递给handlePanelClick().行let currentPanel = eval(此$ {name}的面板);就是我所关心的.

我需要name进行评估,然后将其设置为currentPanel的一部分.如果我删除eval()to just 'this.${name}Panel',则currentPanel不是DOM元素.

这是使用eval()的正确用例吗?

        export default class Profiles extends Component {

      constructor(props) {
        super(props);

        this.ul, this.hunterPanel, this.fieldPanel, ...
         // other declarations...
        this.handlePanelClick = this.handlePanelClick.bind(this);

       }

      handlePanelClick(event, name) {
            event.preventDefault();
            const currentScrollPosition = this.ul.scrollLeft;

            let currentPanel = eval(`this.${name}Panel`); //  <-- is this good practice or is there a better way? Removing eval() means `this` is a string and not a reference to the DOM Element that was clicked.
        // move the unordered list to the left into the viewport
            TweenMax.to(this.ul, 0.75, { scrollTo: { x: currentPanel.getBoundingClientRect().left + currentScrollPosition } });    
          }

      render() {
        return (
            <section className="video-slider">
            <ul ref={ul => this.ul = ul}>
              <li ref={ hunterPanel => this.hunterPanel = hunterPanel }>
                /* html elements */
              </li>
              <li ref={ fieldPanel => this.fieldPanel = fieldPanel }>
                /* html elements */
              </li>
             </ul>
    <ul>
          <li><a onClick={() => this.handlePanelClick(event, "hunter")}><span>Hunter</span></a></li>
          <li><a onClick={() => this.handlePanelClick(event, "field")}><span>Field</span></a></li>
</ul>
</section>
    );
  }
Run Code Online (Sandbox Code Playgroud)

Sag*_*b.g 5

您可以使用括号表示法 使用[]字符串动态地定位对象中的属性:

this[`${name}Panel`]
Run Code Online (Sandbox Code Playgroud)

顺便说一句,eval是邪恶的.尽量不要使用它,除了安全风险之外,浏览器在使用时会转储一些优化eval.