Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在stencil.js/tsx中定义全局变量?_Javascript_Typescript_Jsx_Stenciljs - Fatal编程技术网

Javascript 如何在stencil.js/tsx中定义全局变量?

Javascript 如何在stencil.js/tsx中定义全局变量?,javascript,typescript,jsx,stenciljs,Javascript,Typescript,Jsx,Stenciljs,如何在Stencil.js组件中定义全局变量 @ClickOutside() someMethod() { let editable = this.el.querySelector('.editable'); if (this.el.classList.contains('is-open')) { this.el.classList.toggle('is-open'); editable.setAttribute('contenteditable',

如何在Stencil.js组件中定义全局变量

@ClickOutside()
  someMethod() {
    let editable = this.el.querySelector('.editable');
    if (this.el.classList.contains('is-open')) {
      this.el.classList.toggle('is-open');
      editable.setAttribute('contenteditable',
        editable.getAttribute('contenteditable') === 'true' ? 'false' : 'true');
    }
  }

  openToolbar() {
    let editable = this.el.querySelector('.editable');
    if (editable.getAttribute('contenteditable') === 'true') {
      return
    }
    this.el.classList.toggle('is-open');
    editable.setAttribute('contenteditable',
      editable.getAttribute('contenteditable') === 'true' ? 'false' : 'true');
  }

这正如预期的那样工作,但是我在两个不同的函数中重复我自己。我想在外部定义第一个let变量,以便在两个函数中都使用它。

您可以将其设置为如下状态

    @State() editable;

    componentWillLoad() {
       this.editable = this.el.querySelector('.editable');
    }

    @ClickOutside()
        someMethod() {
            if (this.el.classList.contains('is-open')) {
                this.el.classList.toggle('is-open');
                editable.setAttribute('contenteditable',
                editable.getAttribute('contenteditable') === 'true' ? 'false' : 'true');
             }
        }

        openToolbar() {
            if (editable.getAttribute('contenteditable') === 'true') {
                return
            }
            this.el.classList.toggle('is-open');
            editable.setAttribute('contenteditable',
            editable.getAttribute('contenteditable') === 'true' ? 'false' : 'true');
        }

希望这能对你有所帮助:)

根据Koga的建议,这对我很有效:

@State() editable;

  componentDidLoad() {
    this.editable = this.el.querySelector('.editable');
  }

  @ClickOutside()
  someMethod() {
    if (this.el.classList.contains('is-open')) {
      this.el.classList.toggle('is-open');
      this.editable.setAttribute('contenteditable',
        this.editable.getAttribute('contenteditable') === 'true' ? 'false' : 'true');
    }
  }

  openToolbar() {
    if (this.editable.getAttribute('contenteditable') === 'true') {
      return
    }
    this.el.classList.toggle('is-open');
    this.editable.setAttribute('contenteditable',
      this.editable.getAttribute('contenteditable') === 'true' ? 'false' : 'true');
  }

这被认为是黑客行为还是正确的做法?我不太熟悉JSX和状态,但由于状态不会改变(因此不会重新渲染),我认为这是正确的方法。不是一个解决方法或黑客。:)嘿,我在这样做时遇到了一个错误:ReferenceError:如果我尝试使用此方法,则未定义editable。editable它还会给我一个错误您找到了正确的解决方案:)如果要在第一次渲染之前设置它,请在componentWillLoad方法中启动它。