Vue.js 通过 props 动态改变组件类

Posted

技术标签:

【中文标题】Vue.js 通过 props 动态改变组件类【英文标题】:Vue.js pass props to dynamicly change component class 【发布时间】:2018-08-24 11:53:35 【问题描述】:

我正在尝试学习 Vue 并遇到了这个问题。

Vue.component('alert', 
  props: ['type', 'bold', 'msg'], template: '<div class="alert alert- type " role="alert"><b> bold </b>  msg </div>'
);

var componentProps=new Vue( 
    el: '#app',
  

);
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">

<div id="app" class="container">
  <alert type="info" bold="Greetings." msg="This is some information."></alert>
  <alert type="warning" bold="Slow down." msg="You might crash."></alert>
  <alert type="danger" bold="Oh no!" msg="The program just crashed!"></alert>
  <alert type="success" bold="Rock Out" msg="with your Props out!"></alert>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue"></script>

这是在检查器的输出中。你可以看到 props[type] 在那里没有改变。

<div role="alert" class="alert alert- type '"><b>Slow down.</b> You might crash.</div>

codepen 链接 => https://codepen.io/dakata911/pen/XEKbyq?editors=1010

【问题讨论】:

【参考方案1】:

在 vue 2 中你 can't use interpolations in attributes anymore。你现在有several possible syntaxes for class and style bindings。在您的具体情况下,您可以使用:

<div class="alert" :class="'alert-' + type" role="alert">

下面的演示。

new Vue(
  el: '#app',
  data: 
    type: 'warning'
  
)
.alert  background: yellow; 
.alert-warning  color: red 
<script src="https://unpkg.com/vue"></script>

<div id="app">
  <div class="alert" :class="'alert-' + type" role="alert"> Warning! </div>
</div>

【讨论】:

【参考方案2】:

关于属性插值不起作用,可以使用:绑定

:class="type"

:class="[ type, other, ... ]"

:class=" 'someClass': true, 'other-class': false, 'another': method() "

你可以在同一个元素/标签上同时拥有:class="..." 属性和class="normal class attribute"

【讨论】:

以上是关于Vue.js 通过 props 动态改变组件类的主要内容,如果未能解决你的问题,请参考以下文章

Vue JS - 在插槽中改变传递的道具

关于Vue.js组件巨详细的一篇文章

Vue.js2.0中子组件修改父组件传递过来的props,并不影响父组件的原始数据

Vue.js - 通过 Webpack 注册图表组件

Vue.js 父子组件,为啥我的 prop 在子组件中还没有?

Vue.js 系列教程 2:组件,Props,Slots