【问题标题】:eval an input string on button press in react在反应中按下按钮时评估输入字符串
【发布时间】:2017-12-04 19:21:36
【问题描述】:

我想创建一个包含评估一些用户(javascript)输入的反应的网络应用程序编码游戏。

  constructor(props) {
    super(props);
    this.state = {
      code: ''
    };
  }

  handleChange(key) {
    return event => this.setState({ [key]: event.target.value });
  }

  funScript() {
    eval(this.state.code);
  }

  anotherScript() {
    console.log("Will this work?");
  }

  render() {
    return (
      <div>
        <input 
          type={"text"}
          value={this.state.code}
          onChange={this.handleChange('code')}
         />
        <button onClick={this.funScript()} >run</button>
      </div>
    );
  }

我希望文本输入能够在用户按下按钮时评估 javascript(用户键入 this.anotherScript(); 并且控制台记录“这会工作吗?”。不幸的是,它没有工作,我怀疑这是 React 特有的问题。一旦输入输入框,它就会尝试评估字符串(甚至没有按下按钮!)。请参阅此处以获取示例:https://codesandbox.io/s/54rkp584ll

任何人都有适当的 React 解决方案,不会在第一个字符输入时破坏 javascript(并评估函数)?

【问题讨论】:

    标签: javascript reactjs onclick eval onchange


    【解决方案1】:

    当你输入时

    <button onClick={this.funScript()} >run</button>
    

    您正在呼叫this.funScript。删除括号,您将按照您的意愿传递函数。此外,funScript 需要绑定到 this 才能工作。

    【讨论】:

    • Hmm.. 我发现只是传递了一个在内部执行 this.funScript() 的函数,而没有限制 funScript。 codesandbox.io/s/54rkp584ll &lt;button onClick={() =&gt; {this.funScript()}} &gt;run&lt;/button&gt; 去掉括号没用,但我猜是因为我没有绑定 this.funScript
    • 是的,创建一个调用函数的箭头函数,基本上就是绑定函数。如果你不熟悉箭头函数和this,你应该去看看。这不是很明显,但非常有帮助/很重要。
    【解决方案2】:

    这里有funScript,它使用适当的上下文评估您的代码:

    class Test {
    
        // ...
    
        funScript() {
            const code = ("" + this.state.code).replace(/this/ig, "__self__");
            const execute = new Function("__self__", code);
            execute(this);
        }
    
        // ...
    }
    

    【讨论】:

    • 这是在制作“这个”吗?在执行的代码串中是不必要的?有用,但我不确定它是否解决了这个问题。另外,我对新的 Function 语法不熟悉,但我会研究一下
    • 要评估来自组件Test 的方法,您必须手动pass 一个上下文。如果没有必要,可以使用 this/self 跳过代码。这段代码的好处是您可以重新定义窗口、文档和其他全局对象,这可以极大地提高安全性。
    • 我不关心安全性(因为它的前端,它不应该包含我的目的的安全信息,除了会话令牌......),因为我对沙盒代码,所以我可以中断用户编写的代码的执行,这会导致错误和无限循环等......但这似乎可能有助于沙盒?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 2021-10-21
    • 2020-10-02
    • 2016-06-13
    • 1970-01-01
    相关资源
    最近更新 更多