如何从 Vue 实例外部触发 Stencil 组件功能/方法

Posted

技术标签:

【中文标题】如何从 Vue 实例外部触发 Stencil 组件功能/方法【英文标题】:How to trigger Stencil component function/method from outside Vue instance 【发布时间】:2021-05-16 07:43:32 【问题描述】:

是否有可能从父级 Vue 实例触发 Stencil 组件功能?

例如,我想在 Vue 实例中运行 callChild() 方法,这将触发 Stencil 组件中的 doSomething()

main,带有vue代码文件的html文件,其中包含stencil组件:

<body>
    <div id="app">
      <test-component :rules="[required, passwordRule]" :placeholder="placeholder" :label="label" :value="value" @valueChange="e => onValueChange"></test-component>
      value
      <button @click="foo()">Test</button>
    </div>
  </body>
  <script>
    var app = new Vue(
      el: '#app',
      data() 
        return 
          label: 'Nazwa Użytkownika',
          value: '',
          placeholder: 'Wpisz nazwę użytkownika',
          required: v => !!v || 'This field is required',
          passwordRule: v => v.length >= 8 || 'Your password is too short',
        ;
      ,
      methods: 
        callChild() 
          //this function should trigger bar() function in stancil <test-component>
        ,
        onValueChange(e) 
          console.log(e);
        ,
      ,
    );
  </script>

模板组件代码:

import  h, Component, Element, Event, EventEmitter, State, Watch, Prop, Method  from '@stencil/core';

@Component(
  tag: 'test-component',
  styleUrl: 'test-component.css',
  //shadow: true,
)
export class FormInputBase 
  @Element() el: HTMLElement;
  @Prop() type: string = 'text';
  @Prop() label: string;
  @Prop() rules: Array<Function>;
  @Prop() placeholder: string;
  @Prop( mutable: true ) value: string;
  @Prop() hidedetails: boolean;
  @Event() valueChange: EventEmitter;

  @State() errorDetails: any;
  @State() showError: boolean = false;

  @Watch('value')
  watchHandler(newValue: string, oldValue: string) 
    console.log('The new value of activated is: ', newValue, 'Old val: ', oldValue);
    console.log(this.required(newValue));
    if (this.required(newValue) != true) 
      this.errorDetails = this.required(newValue);
      this.showError = true;
     else 
      this.showError = false;
    

    console.log(this.rules);
  

  required = v => !!v || 'This field is required';

  @Method()
  async testClick(val) 
    await console.log(val);
  

  @Method()
  doSomething() 
    //do something
  

  handleChange(event) 
    const val = event.target.value;
    console.log(val);
    this.value = val;
    this.valueChange.emit(val);
  
  render() 
    if (this.hidedetails) 
      return (
        <div>
          <label>
            this.label
            <div>
              <input placeholder=this.placeholder value=this.value onInput=event => this.handleChange(event)></input>
            </div>
          </label>
        </div>
      );
     else 
      return (
        <div>
          <label>
            this.label
            <div>
              <input placeholder=this.placeholder value=this.value onInput=event => this.handleChange(event)></input>
              <div class="error-details">
                <div class=this.showError ? 'text-active' : 'text-inactive'>this.errorDetails</div>
              </div>
              <button onClick=this.testClick>Kilknij mnie!</button>
            </div>
          </label>
        </div>
      );
    
  


【问题讨论】:

【参考方案1】:

好的 - 答案很简单。您需要使用参考。只需将 ref 标签添加到 html 中的元素:

<test-component ref="form" :rules="[required, passwordRule]" :placeholder="placeholder" :label="label" :value="value" @valueChange="e => onValueChange"></test-component>

然后 Vue 方法应该是这样的:

foo() 
          this.$refs.form.bar();
        ,

其中 bar() 正是您的 Stencil 组件中方法的名称。

【讨论】:

您好,我正在尝试在 vue3 项目中使用由 stencil 构建的 Web 组件。但它不起作用。你能告诉我如何设置吗?

以上是关于如何从 Vue 实例外部触发 Stencil 组件功能/方法的主要内容,如果未能解决你的问题,请参考以下文章

自定义事件在 Vue.js 组件中的应用

如何模拟被 vue 指令触发的方法?

如何为组件的每个实例触发 vue 生命周期事件?

如何在 Vue 3 中以编程方式创建组件实例?

如何将数据从 Vue 实例传递给嵌套组件

如何将数据从 Vue 实例传递给嵌套组件