vue习笔记

1.vue需要引入cdn或者本地

第一天

<div id="app">
    <!-- vue 的文本格式 -->
    <span v-text="ct"></span>
    <!-- vue 的html 可加css样式进行修饰 -->
    <span v-html="zt"></span>
    <!-- vue 的超链接 可简写  v-bind:href/ :href -->
    <a v-bind:href="href">4399</a>
    <!-- 懒汉式   v-if/v-else    省内存  耗时间
         饿汉式   v-show     省时间  耗内存 
    -->
    <p v-if="flag">a</p>
    <p v-else="flag">b</p>
    <ul v-if="show">
        <li>1</li>
        <li>2</li>
        <li>3</li>
    </ul>
    <ul v-else="show">
        <li>4</li>
        <li>2</li>
        <li>3</li>
    </ul>
    <ul v-show="show2">
        <li>7</li>
        <li>2</li>
        <li>3</li>
    </ul>
    <ul>
        <!-- items 对应里面的items -->
        <li v-for="items in citys"></li>
        <li v-for="(items,index) in citys">--</li>

        <ul>
            <li v-for="per in persons">----</li>
        </ul>
    </ul>
    <ul>
        <input type="button" v-on:click="test()" value="test函数">
        <input type="button" v-on:click="add()" value="按钮">
    </ul>
    <div id="app">
        <img :src="path">
    </div>
</div>
<script>
   new Vue({
      el: '#app',
      data: {
        // JSON代码
        message: 'Hello Vue.js!',
        ct:'小黑子',
        zt:"<marquee>小黑子,你干嘛 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o</marquee>",
        href:'https://www.4399.com/',
        flag : false,
        show: true,
        show2:true,
        citys:["1","2","3","4","5","6",],
        persons: [
            {
            name:'a',
            id:1,
            city:10
        },
            {
            name:'b',
            id:2,
            city:11
        },
            {
            name:'c',
            id:3,
            city:12
        },
        ],
        // 用来声明vue中的成员变量的空间
        i : 1,
        path : '../Dres/img/1.jpg'
      },
      methods:{
        test(){
            alert('ak!')
        },
        add:function(){
            var a = 0;
            var b  = a + 2;
            alert('a' + b)
        },
        change(){
            this.i++;
            // 在这个函数中变化的path值的内容 ,在函数中获取data中的变量,使用this.变量名或者vue.变量名
            this.path = "../Dres/img/"+this.i+".jpg";

            if(this.i >= 4){
                this.i = 0;
            }
        }
      },
      mounted(){  //beforeMount也能完成相应效果
        //new Vue中的数据挂载完成 渲染到div中时,调用mounted()函数 即页面数据挂载之后;beforeMount  即页面数据挂载之前  这两种使用较多
        // 定时器
        // 每隔500秒,重复使用change()函数,不要加括号
        setInterval(this.change,500);
      },

        //   mounted(){
        //     alert("4.Vue实列渲染到Html过程中触发")
        //   },    
        //   created(){
        //     alert("2.创建Vue实列时触发")
        //   }, 
        //   beforeCreate(){
        //     alert("1.创建Vue实列之前触发")
        //   },
        //   beforeMount(){
        //     alert("3.Vue实列渲染到Html之前中触发")
        //   },
        //以下两个存在,但通常无法表示出来。请了解即可
        //   beforeDestory(){
        //     alert("5.Vue实列销毁之前触发")
        //   },
        //   destroyed(){
        //     alert("6.Vue实列销毁之后触发")
        //   }
    })
</script>

第二天

    <div id="app">
    <input type="button" value="加法" @click="add(15,25)">
    <input type="button" value="往数组后加" @click="addCity()">
    <input type="button" value="往数组前加" @click="addCity2()">
    <br><br>
    
    <input type="button" value="自增" @click="num+=1">
    <input type="button" value="自减" @click="num-=1">
    
</div>
<script>
   new Vue({
      el: '#app',
      data: {
        citys:["b"],
        num:0
      },
      methods:{
        add(a,b){
            alert("a+b="+(a+b))
        },
        addCity(){
            this.citys.push("c");
        },
        addCity2(){
            this.citys.unshift("a");
        }
      }
    })
</script>

第三天

<div id="app">
    用户名:<input type="text" v-model="uname">
    密码<input type="password" v-model="pwd">
    性别:
    <!-- 默认选中不适用checked = checked -->
    男:<input type="radio" v-model="sex" value="1">    
    女:<input type="radio" v-model="sex" value="0">
    <br>
    爱好:
    看书: <input type="checkbox" value="1" v-model="favor">
    听音乐: <input type="checkbox" value="2" v-model="favor">
    爬山: <input type="checkbox" value="3" v-model="favor">
    蹦极: <input type="checkbox" value="4" v-model="favor">

    <input type="button" @click="submit()" value="提交">
</div>
<script>
   new Vue({
      el: '#app',
      data: {
        uname: 'ch',
        pwd:'123',
        sex:'0', //设置默认选中
        favor:[]
      },
      methods:{
        submit(){
            //alert(this.uname +'-'+ this.pwd +'-'+ this.sex +'-'+ this.favor)
            //在vue中提交数据,需要创建一个对象来封装表单数据
            var person = new Object();
            person.uname = this.uname;
            person.pwd = this.pwd;
            person.sex = this.sex;
            person.favor = this.favor;
            //当前的数据在开发中是需要提交到服务器里面去,通过json数据传递
            var s = JSON.stringify(person); //转换为json对象
            alert(s)
            //这个数据网服务器端发送,需要后面学习axios网络请求技术
        }
      }
    })
</script>

第四天
    <div id="app">
    数值A: <input type="text" v-model="num1">
    数值B: <input type="text" v-model="num2">
    <br><br>
    <input type="button" @click="add()" value="加法">
    <input type="button" @click="jian()" value="减法">
    <input type="button" @click="chen()" value="乘法">
    <input type="button" @click="chu()" value="除法">
    
    <br>
    <!-- v-model使用的后缀参数
    1.lazy 
    2.number 强制转换为数值计算
    3.trim 去掉首尾空格-->
    <!-- lazy测试: <input type="text" v-model.lazy="test()"> -->
</div>
<script>
   new Vue({
      el: '#app',
      data: {
        // 双向绑定只能赋值为字符串
        num1: '',
        num2: '',
        result:''
      },
      methods:{
        add(){
            // 以下方式为拼接字符串  不是计算
            // this.result = this.num1 + this.num2;
            //以下方式也可以计算,但不用再V-model.number(用了也行,不影响)
            // this.result = parseFloat(this.num1) + parseFloat(this.num2)
            this.result = parseFloat(this.num1) + parseFloat(this.num2)
        },
        jian(){
            this.result = parseFloat(this.num1) - parseFloat(this.num2)
        },
        chen(){
            this.result = parseFloat(this.num1) * parseFloat(this.num2)
        },
        chu(){
            this.result = parseFloat(this.num1) / parseFloat(this.num2)
        },
        test(){
            alert('这是lazy')
        }
      }
    })
</script>

第五天
    <div id="app">
    计算属性: 
    <!-- 计算属性调用,只写函数名称 -->
</div>
<!-- 计算属性computed与methods效果最后是一样的,但是computed是基于它的依赖缓存,只有相关依赖发送改变是才会重新取值,而Methods在重新渲染或重新调用执行。 -->
<script>
   new Vue({
      el: '#app',
      data: {
        msg: 'Hello Vue.js!'
      },
    //   函数方法
      methods:{

      },
    //   Vue实例渲染到html过程中的触发的生命周期函数
      mouted:{

      },
      computed:{
        getResult(){
             //split("")是使用空白符,切分Hello Vue;reverse()是反转,join把反转之后每个字母合在一起连接。
            return this.msg.split('').reverse().join('')
        }
      }
    })
</script>

第六条
    <div id="app">
    姓: <input type="text" v-model="firstname">
    名: <input type="text" v-model="secondname">
    号: <input type="text" v-model="lastname">
    <br><br>
    名称(监听): <br><br>
    名称(计算):
</div>
<script>
   new Vue({
      el: '#app',
      data: {
        firstname:'',
        secondname:'',
        lastname:'',
        fullname:''
      },
      methods:{

      },
      mounted:{

      },
      computed:{
        // 计算属性
        getLastname(){
            return this.firstname+this.secondname+this.lastname
        }
      },
    //   监听属性
    //监听所绑定的输入框是firstname
    //表示监听firstname所绑定的输入框
    //当该值改变,就会触发
      watch:{
        firstname(){
            this.fullname = this.firstname + this.secondname + this.lastname
        },
        secondname(){
            this.fullname = this.firstname + this.secondname + this.lastname
        },
        lastname(){
            this.fullname = this.firstname + this.secondname + this.lastname
        },
      }
    })
</script>

第七天
    <div id="app">
    用户名:<input type="text" v-model="unmae">
    <br>
    
    <br>
    
    <br>
    
</div>
<script>
   new Vue({
      el: '#app',
      data: {
        unmae: '',
        msg:'',
        msg2:'hell vue',
        msg3:'HELL VUE',
        date: new Date()
      },
      watch:{
        unmae(){
             //监听uname绑定的输入框里面的值发生变化时,触发当前的函数
            // alert(this.uname)
            //用户验证实列
            // alert(this.unmae)
            if("admin" === this.unmae){
                this.msg = '这个名称被使用了'
            }else{
                this.msg = '可以使用'
            }
        }
      },
    //   过滤器属性
      filters:{
        // 小写转大写
        upperCHange(a,args){
            return args+a.toUpperCase()
        },
        lowerCHange(a,args){
            return args+a.toLowerCase()
        },
        // 日期的格式转化
        deteformat(val,args){
            return args+val.getFullYear()+'-'+(val.getMonth()+1)+'-'+val.getDate()+'     '+val.getHours()+':'+val.getMinutes()+':'+val.getSeconds()
        }
      }
    })
</script>

第八天  案例
    <div id="app">
    <div class="grid">
        <table>
            <tr  class="titleup">
                <td colspan="4">
                    编号: <input type="text" v-model="code">
                    名称: <input type="text" v-model="name">
                    <input type="button" value="提交" @click='add()'>
                </td>
            </tr>
            <tr class="title">
                <td>编号</td>
                <td>名称</td>
                <td>时间</td>
                <td>操作</td>
            </tr>
            <tr v-for="book in books">
                <td></td>
                <td></td>
                <td></td>
                <td>
                    <a href="#" @click='edit(book)'>修改</a>
                    <a href="#" @click='deletebook(book)'>删除</a>
                </td>
            </tr>
        </table>
    </div>
</div>
<script>
   new Vue({
      el: '#app',
      data: {
        code:'',
        name:'',
        flag:false,   //fales
        index:'',
        books:[
            {
                id:'1',
                name:'三国',
                date:new Date()
            },
            {
                id:'2',
                name:'水浒',
                date:new Date()
            },
            {
                id:'3',
                name:'红楼梦',
                date:new Date()
            },
        ]
      },
      filters:{
        // 日期的格式转化
        deteformat(val){
            return val.getFullYear()+'-'+(val.getMonth()+1)+'-'+val.getDate()
        }
      },
      methods:{
        //添加数据
        add(){
            // 加入一个空值判断
            if(this.code.length != 0 && this.name.length != 0 && !this.flag){
            var newBook = new Object();
            newBook.id = this.code;
            newBook.name = this.name;
            newBook.date = new Date();
            // 把当前newbook的数据加入books数组中
            this.books.push(newBook);
            // 清空输入框
            this.code ='';
            this.name ='';
            }else if(this.name.length != 0){
                this.books[this.index].name = this.name;
                this.books[this.index].code = this.code;
                this.flag = false;
                this.code ='';
                this.name ='';
            }
        },
        deletebook(book){
            // alert(book.name)
            //从数组中移除一个元素
            //先获取当前元素在数组中的下表索引
            var bookIndex = this.books.indexOf(book);
            //执行移除操作,第一个参数是要删除的数组的下标值;第二个参数:删除的个数
            this.books.splice(bookIndex,1);
        },
        edit(book){
            this.flag = true;
            this.code = book.id;
            this.name = book.name;
            this.index = this.books.indexOf(book);
        }
      }
    })
</script>