如何将对象作为道具传递给我的 vue 生成的 Web 组件

How to pass an object as a prop to my vue-generated web component

我的目标是创建一个 Web 组件并在 vue 应用程序中使用它。创建不是问题,使用也不是问题。 我没有成功的是将 object 作为 prop 传递给我的 Web 组件。不过,传递布尔值或字符串似乎工作正常。

我的 vue 组件道具:

props:{
    user: {
      type: Object,
      required: true,
      default: function() {
        return {
          name: "Default",
          age: 0,
          mail: "default@mail.com"
        }
      }
    },
    readOnly:{
      type: Boolean,
      default: function(){
        return false
      }
    }
  }

我用vue-cli创建web组件的脚本:

npm run build -- --target wc --inline-vue --name my-web-component

我想在其中使用我的 Web 组件的非常简单的应用程序:

<html>
    <head>
        <meta charset="utf-8">
        <title>my-web-component demo</title>
        <script src="https://unpkg.com/vue"></script>
        <script src="./my-web-component.js"></script>
    </head>
    <body>
        <div id="myapp">
            <my-web-component></my-web-component>
        </div>
    </body>
</html>    
<script>
    new Vue({
        el: "#myapp",
        data: {
            user: {
                name: "John",
                age: 31,
                mail: "john.doe@mail.com"
            }
        }
    })
</script>

我尝试将对象作为 user prop:

1. <my-web-component></my-web-component> //expected

2. <my-web-component v-bind:user="user"></my-web-component> //not expected

3. <my-web-component v-bind:user.prop="user"></my-web-component> //not expected

结果(通过组件挂载钩子内的console.log获得):

  1. 用户 = 默认道具值 { name: "Default", age: 0, mail: "default@mail.com" }
  2. 用户=[object Object]
  3. 用户 = 默认道具值 { name: "Default", age: 0, mail: "default@mail.com" }

readOnly 属性没有任何问题。

那么,你知道如何将对象作为 prop 传递给我的 vue 生成的 Web 组件吗?

这是 github 回购的 link:https://github.com/Miloo25155/my-web-component.git

构建的web组件在dist文件夹中,还有简单的vue app(dist/demo.html)

感谢您的宝贵时间。

Vue Webcomponent Wrapper 确实将道具传递给您的 Vue 组件,但它只适用于字符串。这就是您在示例 2 中看到 [Object object] 的原因。一个可能的解决方法是在您的组件中为 user 和 JSON.parse 接受一个字符串值(而不是假设 prop 将是一个对象)。

您可能有充分的理由构建组件的独立 Web 组件版本,也许您想将其作为产品交付给用户或客户。如果我是您的网络组件的最终用户,我希望像这样使用它:

<html>
<head>
<script src="my-web-component.js"></script>
</head>
<body>
<my-web-component user="{name: 'joshua'}"></my-web-component>
</body>
</html>

如果我查看您提供的代码示例,我发现您正在尝试在一个小型 Vue 应用程序中使用您的组件的 webcomponent 版本。正如您所经历的和我解释过的那样,这将不起作用,除非您在将其传递给 my-web-component 之前 JSON.stringify 用户。我想你有两个选择可供选择:将组件开发为常规 vue 组件(并在完成后将其导出为独立的 web 组件)或将其视为真正的 web 组件(包括它的局限性,因为你不会得到您习惯于使用常规组件的高水平反应性。