【问题标题】:chrome js console: can I use it as ES6 react js component in desktop JS application?chrome js 控制台:我可以将它用作桌面 JS 应用程序中的 ES6 react js 组件吗?
【发布时间】:2019-04-13 12:44:25
【问题描述】:

有什么方法可以让我自己的 Chrome 控制台实例作为我的 桌面 应用程序中的反应组件。作为桌面应用程序假定我的应用程序启动并运行

说明我在我的应用程序的 JS 脚本端寻找什么的代码:

class App extends Component {
 constructor() {
   super();
   this.logger_one = null;
   this.logger_two = null;
 }

 render() {
  return (<div>
             <SomeOtherComponent .../>
             <ChromeConsole ref={(r)=>{this.logger_one = r}} />
             <hr/>
             <ChromeConsole ref={(r)=>{this.logger_two = r}} />
          </div>
           )
 }

 event_handler_one() {
   logger_one.log("something happen for one...");
 }

 event_handler_two() {
   logger_two.log("something happen for two...");
 }
}

this.logger_onethis.logger_two 假设引用像 console 这样的对象的实例,所以我可以使用这个 API:https://developers.google.com/web/tools/chrome-devtools/console/console-reference

我需要参考 Chrome 控制台实例,而不是定制控制台替换。这很重要,因为我确实需要 js 开发人员可以使用的所有不错的功能,但目的不同 - 观察和了解我的系统行为。

【问题讨论】:

  • “某些事件”比如什么?
  • 好吧,这不是 Chrome 控制台的实际实例,但您可以复制它的功能......这方面的一个例子是本网站 Stack Snippets 功能中的控制台 div
  • @PatrickEvans 我无法听从您的提示。这个问题将有赏金所以请详细说明。我需要在我的应用程序主窗口中有多个记录器,并具有一些复杂的功能。仅拥有 textarea 实例只是一个初始选项。
  • 是的,显然可以创建一个基于某种状态漂亮地显示字符串的组件。您是在寻求图书馆推荐,希望有人为您写一篇,还是您有具体问题?
  • 不幸的是,这在 SO 上被认为是题外话 - 请参阅 softwarerecs.stackexchange.com

标签: javascript reactjs google-chrome-devtools


【解决方案1】:

注意事项

  • window.console 对象是无法实例化的本机实现,因为没有可用的构造函数。但这很好,因为您的“两个”记录器可以毫无问题地使用相同的window.console

  • 结构&lt;ChromeConsole ref={(r)=&gt;{this.logger_one = r}} /&gt; 将在this.logger_one 中存储对DOM JSX 元素(See Refs on React docs)的引用,因此它不是我们可以操作的引用。但这很好,因为我们可以使用任何其他属性。


您可以使用功能组件来定义一个属性(例如console)并使用它来返回窗口控制台:

export default const ChromeConsole = ({ id, console }) => {
  console(window.console);
  return (<div data-logger-id={id} />);
}

然后将其用作:

class App extends Component {
  constructor() {
    super();
    this.logger_one = null;
    this.logger_two = null;
  }

  render() {
    return (
      <div>
        <SomeOtherComponent .../>
        <ChromeConsole id="one" console={(r)=>{this.logger_one = r}} />
        <button onClick={event_handler_one} />
        <hr/>
        <ChromeConsole id="two" console={(r)=>{this.logger_two = r}} />
        <button onClick={event_handler_two} />
      </div>
    );
  }

  event_handler_one = () => {
    this.logger_one.log("something happen for one...");
  }

  event_handler_two = () => {
    this.logger_two.log("something happen for two...");
  }
}

【讨论】:

    【解决方案2】:

    这是我的建议:

    <div id="log"></div>
    <input id="command" onkeyup="handleCmdEnter(event,this)"/>
    

    还有js:

    var old = console.log;
    var logger = document.getElementById('log');
    
    console.log = function (message) {
      if (typeof message == 'object') {
        logger.innerHTML += (JSON && JSON.stringify ? JSON.stringify(message) : message) + '<br />';
      } else {
        logger.innerHTML += message + '<br />';
      }
    }
    
    window.handleCmdEnter = (event, input) => {
      if(event.key=='Enter'){
          let val = input.value;
          input.value ='';
          logger.innerHTML+='<br>'+val;      
    
          try {
            let res = eval(val);
            logger.innerHTML+='<br>'+res;  
          } catch (e) {
            old({e});
            logger.innerHTML+='<br>EXCEPTION:'+e.message;
            logger.innerHTML+='<br>Stacktrace:'+e.stack;
          }
      } 
    }
    
    console.log('xxx');
    

    这里是working example

    此解决方案不包含样式并使用 'eval' (=evil) 功能。它覆盖了“console.log”函数(您可以覆盖其他控制台函数,如errordebug,...还可以使用arguments 拦截更多控制台参数)。

    我只是在上面给出了基本的想法,它需要被开发(作为 js 库)来拥有更多的功能,但是 StackOverflow 可以放置这样的代码。

    【讨论】:

    • 好吧,但我确实需要 Chrome 控制台。我已经更新了这个问题。很抱歉造成混乱
    猜你喜欢
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 2021-05-19
    • 1970-01-01
    • 2020-06-18
    • 2012-07-31
    • 2021-04-18
    相关资源
    最近更新 更多