一、v-text与v-html
v-text更新html元素的innerText
v-html更新html元素的innerHtml
如果需要更新部分内容需要使用{{ }} 双括号差值表达式
案例:
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>VUE指令 v-text v-html</title>
    <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
  </head>
  <body>
    <!-- 
     v-html 可以识别标签
     v-text 不可以识别标签
     两个都会替换标签元素的内容
     -->
    <div id="app">
      <div v-text="info"> <span>默认</span> 666 </div>
      <div v-html="info"> <span>默认</span> 666 </div>
    </div>
    
    <script type="text/javascript">
      const vm = new Vue({
        el:"#app",
        data:{
          info:" <p> 这是个段落 </p> "
        }
      })
</script>
    
  </body>
</html>
二、v-if与v-show
两者都是根据表达式的值得真假确定是否渲染元素
v-if表达式真假改变时元素会被销毁或者重建
v-show表达式真假改变时元素不会被销毁或者重建,只是切换了display属性
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Vue指令 v-if</title>
    <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
  </head>
  <body>
    
    <div id="app">
      <!-- v-if 每次都会渲染原始文本 (重建元素) -->
      <p v-if="flag">这是p标签</p>
      <span v-else>这是行内标签</span>
      
      <span v-if="score>90">优秀</span>    
      <span v-else-if="score>70">还行</span>
      <span v-else-if="score>60">凑乎</span>
      <span v-else>渣渣</span>
      <!-- v-show只是切换元素display样式 -->
      <p v-show="flag">这是个段落</p>
    </div>
    
    <script type="text/javascript">
      const vm = new Vue({
        el:"#app",
        data:{
          flag:false,
          score:80
        }
      })
</script>
  </body>
</html>
<!-- 
 怎么考虑使用v-if 或者 v-show
 频繁切换使用v-show
 在初始化时就控制显示隐藏使用v-if
 v-show初始开销大  v-if频繁切换开销大
 -->
三、v-for
列表渲染 需要使用v-for
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>VUE 指令 v-for</title>
    <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
  </head>
  <body>
    <div id="app">
      <!-- item 项目   代表可迭代对象中的一个元素 -->
      <!-- :key 用于VUE虚拟DOM的优化操作 只可以取值 number string -->
      <!-- 遍历数组得到第一个形参为数组中的每一个对象  第二个形参为元素索引 -->
      <p v-for="(item,index) in weekday" :key="item"> {{index}} {{item}}</p>
      <!-- 遍历证书 第一个形参为从1开始的数值 第二个形参为索引-->
      <span v-for="(item,index) in 9" :key="index">{{index}}--{{item}}</span>
      <!-- 遍历字符串第一个形参为每一个字符 第二个形参为索引 -->
      <p v-for="(item,index) in 'hello'" >{{index}}--{{item}}</p>
      <!-- 遍历对象时第一个形参为值 第二个形参为键 第三个形参为索引 -->
      <div v-for="(value,key,index) in myobj" :key="key">{{index}}--{{key}}--{{value}}</div>
    </div>
    
    <script type="text/javascript">
      const vm = new Vue({
        el:"#app",
        data:{
          weekday:["星期1","星期2","星期3","星期4","星期5","星期6","星期7",],
          myobj:{
            name:"zzy",
            age:20
          }
        }
      })
</script>
  </body>
</html>
四、v-on与@
所注册的事件都要写在methods属性中
v-on:事件名称
v-on:事件名称形式 可以使用@事件名称替代
@click.once可以执行一次事件
@click.prevent 可以阻止默认事件执行
@click.stop 可以阻止事件冒泡
@keyup.enter键盘之类事件
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>VUE 指令 v-on</title>
    <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
  </head>
  <body>
    <div id="app">
      <!-- 监听键盘事件 -->
      <input type="text" @keyup.a.n="mykeyup">监听按键
      <br>
      <!-- 阻止默认事件 -->
      <a href="http://www.baidu.com" @click.prevent>百度</a>
      <!-- 仅执行一次 -->
      <span @click.once="goto123()">点击只有一次相应</span>
      <div id="div1">
        div1
        <div id="div2" @click="myclick2">
          div2
          <div id="div3" @click.stop="myclick3">
            div3
          </div>
        </div>
      </div>
      
    </div>
    <script type="text/javascript">
      const vm = new Vue({
        el:"#app",
        data:{
          
        },
        methods:{
          myclick2(){
            console.log("点击了div2");
          },
          myclick3(){
            console.log("点击了div3");
          },
          goto123(){
            console.log("goto 123");
          },
          mykeyup(e){
            console.log("抬起",e.key);
          }
        }
      })
</script>
  </body>
</html>
五、v-bind与冒号(😃
可以将data中变量与属性进行绑定
v-bind:属性名=“”
v-bind可以省略直接使用 :属性名
当绑定的为class或者style样式时需要注意有所不同
:class 值为数组时根据数组中元素的真实值取类名 值为对象时根据键值对的值确定类名是否有键
:style 值为数组时需要使用对象作为数组元素 值为对象键值对即为style样式键值对
案例:绑定普通属性
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>VUE</title>
    <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
  </head>
  <body>
    <div id="app">
      <!-- 使用v-bind绑定title属性   如果值中有纯粹字符串需要使用字符串格式单引号或者双引号 -->
      <span v-bind:title="info+'span1'">鼠标划入有提示</span>
      <!-- 使用冒号代替 v-bind -->
      <span :title="info+'span2'">鼠标划入有提示</span>
      <!-- 绑定的值为对象 -->
      <a :href="baidu.href">{{baidu.text}}</a>
    </div>
    
    <script type="text/javascript">
      const vm = new Vue({
        el:"#app",
        data:{
          info:"我是一个span",
          baidu:{
            href:"http://www.baidu.com",
            text:"百度"
          }
        }
      })
</script>
  </body>
</html>
案例:绑定类名
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>VUE</title>
    <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
    <style type="text/css">
      p.red{
        color: red;
      }
      p.blue{
        background-color: lightblue;
      }
      p.bigger{
        font-size: 30px;
      }
</style>
  </head>
  <body>
    <!-- 
    使用v-bind绑定类名需要注意 可以有列表和字典两种形式 
    如果是列表  列表中元素如果是纯字符串 直接使用  如果是变量 类名就是变量对应的值
    如果是字典  类名能不能取键 取决于键对应的值为true或者false   如果值为变量 需要解释
    列表中的元素 是不是 类名?如果是变量 类名是变量对应的值     如果是纯字符串 类名为该字符串
    对象中的健 是不是类名?键一定是类名  但是能不能显示这个类名 取决于键对应的值
     -->
    <div id="app">
      
      <p :class="[color,'blue']" class="bigger">p1</p>
      <p :class="{red:true,blue:flag}">p2</p>
    </div>
    
    <script type="text/javascript">
      const vm = new Vue({
        el:"#app",
        data:{
          color:"red",
          flag:false
        }
      })
</script>
  </body>
</html>
案例:绑定样式
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>VUE</title>
    <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
  </head>
  <body>
    <div id="app">
      <p style="color: red; background-color: lightcoral;">p1</p>
      
      <!-- 当:style 值为对象时 对象的健必须为样式名 不能使用-这个连字符 需要转小驼峰 
        对象的值 如果是变量 需要解释  如果是纯字符串 直接使用
       -->
      <p :style="{color:color,backgroundColor: 'lightcoral'}" style="font-size: 30px;">p2</p>
      
      <!-- 当style的值为数组时 要求数组中的每一个元素都必须为对象
      对象 中的健必须是样式属性名  对象的值如果是变量需要解释  如果是纯字符串 直接使用
       -->
      <p :style="[{color:color},{backgroundColor:'lightcoral'} ]">p3</p>
    </div>
    <script type="text/javascript">
      const vm = new Vue({
        el:"#app",
        data:{
          color:"red",
        }
      })
</script>
  </body>
</html>
六、v-model
在表单控件或者组件上创建双向数据绑定
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>VUE指令v-model</title>
    <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
  </head>
  <body>
    
    <div id="app">
      <form action="#" method="get">
        <div>
          <h1>普通输入框使用字符串</h1>
          <input name="normal" type="text" v-model="info">
          <br>
          你输入的为 <span>{{info}}</span>
        </div>
        
        <div>
          <h1>复选框使用数组</h1>
          爱好:
          <br>
            足 <input name="hobbys" v-model="hobbys" type="checkbox" value="足球">
          <br>
            篮 <input name="hobbys" v-model="hobbys" type="checkbox" value="篮球">
          <br>
            羽毛 <input name="hobbys" v-model="hobbys" type="checkbox" value="羽毛球">
        </div>
        
        <div>
          <h1>单选框使用字符串</h1>
          性别:
          <br>
          男 <input type="radio" v-model="gender" value="男生" name="sex">
          <br>
          女 <input type="radio" v-model="gender" value="女生" name="sex">
          
        </div>
        
        <div>
          <h1>单个下拉选项使用字符串</h1>
          <select name="address" v-model="address">
            <option value="上海">上海</option>
            <option value="北京">北京</option>
            <option value="广州">广州</option>
          </select>
        </div>
        
        <div>
          <h1>多个下拉选项使用数组</h1>
          <select name="address2" v-model="address2" multiple>
            <option value="上海">上海</option>
            <option value="北京">北京</option>
            <option value="广州">广州</option>
          </select>
        </div>
        <input type="submit" value=""/>
      </form>
    </div>
    
    <script type="text/javascript">
      const vm = new Vue({
        el:"#app",
        data:{
          // MVVM 双向绑定 将数据同步到视图   将视图同步到数据
          info:"",
          hobbys:["篮球","羽毛球"],
          gender:"女生",
          address:"广州",
          address2:["广州","北京"]
        }
      })
</script>
  </body>
</html>
七、自定义指令
可以使用vue的directives属性扩展指令
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>VUE自定义指令</title>
    <style type="text/css">
      #div{
        height: 50px;
        background-color: lightblue;
      }
</style>
    <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
  </head>
  <body>
    <div id="app">
      <div v-show="flag">v-show 使用原生指令控制显示隐藏效果 </div>
      <div v-myshow="flag">v-myshow 使用自定义指令控制显示隐藏效果</div>
      <div id="div" v-dbsize="flag">v-dbsize 使用自定义指令控制尺寸变化效果</div>
      <button @click="flag=!flag">点击切换div效果</button>
    </div>
    
    <script type="text/javascript">
      const vm = new Vue({
        el:"#app",
        data:{
          flag:true
        },
        directives:{
          "dbsize":{
            inserted(ele,state){
              if(state.value){
                let height = getComputedStyle(ele).height;
                height= height.substr(0,height.length-2);
                ele.style.height = height*2 +"px";
              }
            },
            update(ele,state){
              if(state.value){
                let height = getComputedStyle(ele).height;
                height= height.substr(0,height.length-2);
                ele.style.height = height*2 +"px";
              }
              else{
                let height = getComputedStyle(ele).height;
                height= height.substr(0,height.length-2);
                ele.style.height = height/2 +"px";
              }
            }
          },
          "myshow":{
            //  创建元素时执行
            inserted(element,state){
              if(state.value){
                element.style.display="block";
              }else{
                element.style.display="none";
              }
            },
            // flag值发生变化会执行
            update(element,state){
              if(state.value){
                element.style.display="block";
              }
              else 
              {
                element.style.display="none";
              }
            }
            
          }
        }
      })  
</script>
  </body>
</html>




















