从 vue 中的子组件控制一个 prop 类

Posted

技术标签:

【中文标题】从 vue 中的子组件控制一个 prop 类【英文标题】:Controlling a prop class from the child component in vue 【发布时间】:2019-12-24 00:51:57 【问题描述】:

我仍然掌握了 Vue 的窍门,我需要在这里做一些让我无法理解的事情。我有一个WS.vue 组件,它通过单击复选框将一个类绑定到一个div(活动)。目前,点击有效。它将类独立地更改为这个可重用组件的每次调用。我想进一步控制 WS 组件的哪些实例开始活动,哪些不活动。如果它加载活动,切换应该仍然能够关闭活动,反之亦然。

这是 WS 组件:

<template>
  <div class="ws" :class="active: active">
    <span class="ws-content">
      <label class="uk-switchl" uk-toggle="target: #toggleSwitch">
        <input type="checkbox" id="toggleSwitch" @change="active = !active" />
        <div class="uk-switch-slider uk-switch-small"></div>
      </label>
    </span>
  </div>
</template>

<script>
export default 
  name: "ws",
  props: 
    active: false
  ,
  data() 
    return 
      // active: false,     not necessary I believe
    ;
  
;
</script>

将使用它们的父组件现在看起来像这样

<WS agency1="Boston" />
<WS agency1="Boston" />
<WS agency1="Phildelphia" />
...
...
<WS agency1="Miami" />

我想这样使用它们

<WS agency1="Boston" />
<WS agency1="Phildelphia" active/>

<WS agency1="Boston" active="false" />
<WS agency1="Phildelphia" active="true"/>

这样我可以将 active 属性绑定到 API 并通过布尔值控制它

这有意义吗?

【问题讨论】:

【参考方案1】:

简短的回答是您应该将您的状态完全保留在父组件中。只需在复选框更改时发出一个事件,并通知父级何时更改其状态。

你可以像这样实现 ws 组件:

export default 
  props: 
    active: 
      type: Boolean,
      required: true,
    ,
  ,
  methods: 
    onChange() 
      this.$emit('toggle');
    ,
  ,
;

注意:

我们已删除data 您需要从您的模板中调用onChange。将@change="active = !active" 替换为@change="onChange"

父组件应该像这样声明一个ws数据数组:

data() 
  return 
    wsData: [
       name: 'Boston', active: false ,
       name: 'Seattle', active: false ,
       name: 'San Francisco', active: true ,
       name: 'New York', active: false ,
    ],
  ;
,

父模板可以像这样渲染一组ws组件:

<ul>
  <li v-for="(ws, index) in wsData" :key="index">
    <WS :agency="ws.name" :active="ws.active" @toggle="toggleState(index)" />
  </li>
</ul>

最后你将添加一个像这样的toggleState 方法:

methods: 
  toggleState(index) 
    this.wsData[index].active = !this.wsData[index].active;
  

顺便说一句,我建议使用eslint-plugin-vue,并将其调高至plugin:vue/recommended。这将阻止你做一些事情,比如声明一个 data 键来隐藏你的一个道具。

【讨论】:

我喜欢这个结构。比我的更专业和可扩展。但它不起作用。 v-for 出于某种原因没有循环。该机构也没有显示。切换功能虽然 不幸的是,没有所有代码很难调试。请注意,您需要在 ws 组件声明中将 agency 添加到您的道具中。我将它们关闭,因为它与示例无关。如果您可以使用所有工作的最小示例创建一个小提琴,我可以看看。

以上是关于从 vue 中的子组件控制一个 prop 类的主要内容,如果未能解决你的问题,请参考以下文章

Vue 组件 prop 更改不会触发重新渲染

Vue父子组件传值

Vue.js 中的子组件有啥用,为啥要创建子组件?

vueprovide传值对象不能取data的值

使用 props 将 php 变量设置为 vue 组件

[转]VUE3中的Provide / Inject用法