使用CSS在vuejs中输入值:not [value =“”]

时间:2019-11-26 18:09:56

标签: javascript css vue.js input bootstrap-vue

我正在VueJS项目中使用Bootstrap-Vue,使用类是不可能的。

我有下一个输入

<div class="input__wrapper">
   <b-form-input
     v-model="idOrNameSelected"
     class="textfield"
     :class="{'input--empty': idOrNameSelected != null}"
     @keydown.enter.native="onSubmit" />
     <label
       class="input__label">Service id or name</label>
</div>

在我的脚本部分中,我定义了 idOrNameSelected ,例如:

data () {
    return {
      idOrNameSelected: ''
    }
  }

在我的scss文件中,我有一条类似

的规则
&:focus ~ .input__label,
&:not([value=""]) ~ .input__label {
  top: 8px;
  pointer-events: none;
}

当我在输入中输入任何文本时,从未使用此css规则,为什么?????

谢谢

2 个答案:

答案 0 :(得分:2)

这是问题所在。 CSS逻辑不了解Vue观察者或v-model,因此不会更新您的思维方式。退后一步,尝试以下简单示例:

HTML

<input class="in" type="text" value="bar" />
<label class="lab">Test</label>

CSS

.in:not([value="foo"]) ~ .lab {
  color: crimson;
}

如您所见,标签现在为红色。现在尝试更改value="foo",您将看到label的开关颜色。但是,您应该在这里注意的是,它在CSS本身上没有任何2种方式的绑定,而实际上只是在实际DOM中采用当前值

为了向您提供实际的解决方案,在这种情况下,我将使用类绑定。 您可以在这里阅读有关它们的信息:https://vuejs.org/v2/guide/class-and-style.html

从本质上讲,它使您可以根据某些真实条件动态地添加/删除类。您实际上可以在那里使用v模型。

这是我如何做的一个例子:

<template>
  <div id="app">
    <input type="text" v-model="model">
    <label :class="{error: model === ''}">Label</label>
  </div>
</template>

<script>
export default {
  name: "App",
  data() {
    return { model: "" };
  }
};
</script>

<style scoped>
.error {
  color: crimson;
}
</style>

答案 1 :(得分:1)

@ dev-cyprium关于Vue在使用v模型时不将属性value放置在输入元素上是正确的(value实际上是元素上的domProp)

不过,您可以使用数据属性来完成一项技巧:

<template>
  <div>
    <b-form-input id="the-input" v-model="value" :data-value="value"></b-form-input>
    <label for="the-input">Hello World</label>
  </div>
</template>

<style>
  input.form-control ~ label {
    color: red;
  }
  input.form-control[data-value=""] ~ label {
    color: blue;
  }
</style>

<script>
  export default {
    data() {
      return {
        value: ''
      }
    }
  }
</script>