vue

7个属性

  • el属性

    • 用来指示vue编译器从什么地方开始解析 vue的语法,可以说是一个占位符。



  • data属性

    • 用来组织从view中抽象出来的属性,可以说将视图的数据抽象出来存放在data中。


  • template属性

    • 用来设置模板,会替换页面元素,包括占位符。

  • methods属性

    • 放置页面中的业务逻辑,js方法一般都放置在methods中

  • render属性

    • 创建真正的Virtual Dom

  • computed属性

    • 用来计算

  • watch属性

    • watch:function(new,old){}

    • 监听data中数据的变化

    • 两个参数,一个返回新值,一个返回旧值,


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
</head>
<body>
<div id="app">
    {{ message }}
</div>


<script>
    var vm = new Vue({
        el: '#app',
        data: {
            message: "hello vue!"
        }
    })
</script>
</body>
</html>

在线cdn    https://cn.vuejs.org/v2/guide/installation.html

vue实现实时同步数据,不需要刷新,后台数据可以模拟,例如这里的data




v-bind 绑定属性

v-bind:title="message"  可以简写  :title="message"
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
       <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
</head>
<body>
<div id="app">
   <span v-bind:title="message">悬浮试试</span>
</div>


<script>
    var vm = new Vue({
        el: '#app',
        data: {
            message: "hello vue!"
        }
    })
</script>
</body>
</html>

a标签url绑定




判断

  • v-if

  • v-if-else

  • v-else

  • v-show

动态修改display等等


性能决定选择




小案例 tab页切换

v-if

v-show


循环

v-for="item in items"
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
</head>
<body>
<div id="app">
    <li v-for="item in items">{{item.msg}}</li>
</div>


<script>
    var vm = new Vue({
        el: '#app',
        data: {
            // [] 数组  {}对象
            items: [
                {msg: 'vis.yang'},
                {msg: 'robot'}
            ]
        }
    })
</script>
</body>
</html>

绑定事件


// 方法必须定义在methods对象中     v-on:click="sayHi"  可简写成@click="sayHi"  


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
</head>
<body>
<div id="app">
    <button v-on:click="sayHi">click me</button>
</div>


<script>
    var vm = new Vue({
        el: '#app',
        data: {
            msg: '执行了sayHi'
        },
        methods: {
            // 方法必须定义在methods对象中
                       //可简写 sayHi(){
                                  alert(this.msg)
                             }

            sayHi: function () {
                alert(this.msg);
            }

        }
    });
</script>
</body>
</html>

带参写法 

// $event 防止丢失原有的event

事件修饰符 



示例,阻止跳转

阻止事件冒泡,叠层事件


双向绑定    v-model  动态操作表单标签的值


<input type="text" v-model="message"/> {{message}}   原始 v-model:value="message"  简写 v-model="message"


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
       <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
</head>
<body>
<div id="app">
    <input type="radio" name="sex" value="man" v-model="sex">男
    <input type="radio" name="sex" value="woman" v-model="sex">女
    选择的性别:{{sex}}
</div>


<script>
    var vm = new Vue({
        el: '#app',
        data: {
            sex: ''
        },
    });
</script>
</body>
</html>


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
       <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>    
</head>
<body>
<div id="app">
    <select name="" id="" v-model="selected">
        <option value="A">A</option>
        <option value="B">B</option>
        <option value="C">C</option>
    </select>
    value:{{selected}}
</div>


<script>
    var vm = new Vue({
        el: '#app',
        data: {
            selected: ''
        },
    });
</script>
</body>
</html>




数据代理

代理数据不参与遍历


代理原理

数据代理

getter setter 操作数据 界面主动刷新


{{ _data.name }}       数据代理后简写成{{ name }}

事件修饰符

连用


键盘事件


计算属性

插值语法写姓名案例  若firstName方法多起来就不易于阅读了

methods语法写姓名案例   方***被重复调用,模板重新解析,效率不高


计算属性实现姓名案例







计算属性简写  条件:只读不改可简写


计算属性的天气案例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vue学习</title>

</head>

<body>
    
    <div id="app">
        <h2>hello {{name}}</h2>
        <!-- <h1>今天天气很{{isHot?'炎热':'凉爽'}}</h1> -->
        <!-- 利用计算属性,减少模板里的判断 -->
        <h1>今天天气很{{info}}</h1>
        <!-- <button v-on:click="change">切换天气</button> -->
        <button @click="change">切换天气</button>
    </div>




    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
    <script>
        new Vue({
            el: "#app",
            data: {
                name: "Vis.Yang",
                isHot: 'true',
            },
            computed: {
                info() {
                    return this.isHot ? '炎热' : '凉爽';
                }
            },
            methods: {
                change() {
                                        //取反赋值回
                    this.isHot = !this.isHot;
                }
            },

        })

    </script>
</body>

</html>

效果


监视属性


其他写法


深度监视

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vue学习</title>

</head>

<body>

    <div id="app">
        <h2>hello {{name}}</h2>
        <!-- <h1>今天天气很{{isHot?'炎热':'凉爽'}}</h1> -->
        <!-- 利用计算属性,减少模板里的判断 -->
        <h1>今天天气很{{info}}</h1>
        <!-- <button v-on:click="change">切换天气</button> -->
        <button @click="change">切换天气</button>
        <h2>点击了{{number.a}}下</h2>
        <button @click="number.a++">点击次数+1</button>
        <h2>点击了{{number.b}}下</h2>
        <button @click="number.b++">点击次数+1</button>
        <h2></h2>
    </div>




    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
    <script>
        //关闭生产提示
        Vue.config.productionTip = false;
        // 实例化Vue
        const vm = new Vue({
            el: "#app",
            data: {
                name: "Vis.Yang",
                isHot: 'true',
                number: {
                    a: 1,
                    b: 1,
                }
            },
            //计算
            computed: {
                info() {
                    return this.isHot ? '炎热' : '凉爽';
                }
            },
            // 方法
            methods: {
                change() {
                    this.isHot = !this.isHot;
                }
            },
            // 监视
            watch: {
                //检测isHot
                isHot: {
                    // immediate: true,//初始化时让handler调用一下
                    handler(newValue, oldValue) {
                        console.log("isHot被修改了" + "新值:" + newValue + "旧值" + oldValue);
                    }
                },
                //监视多级结构中某个属性的变化
                // key:value中key其实时字符串类型
                // 'number.a': {
                //     handler() {
                //         console.log('a的值改变了');
                //     }
                // },

                //监视number中的所有的属性 deep: true
                'number': {
                    deep: true,//开启深度监视
                    handler() {
                        console.log('有值改变');
                    }
                },
            },
        })

    </script>
</body>

</html>


vue组件

自定义标签

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!--    <script src="../js/vue.js"></script>-->
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
</head>
<body>
<div id="app">

<my-component></my-component>

</div>


<script>
    Vue.component("my-component",{
       template:'<li>vis.yang</li>'
    });
    var vm = new Vue({
        el: '#app',
        data: {
            name: 'vis.yang',
            age: '18',
        },
    });
</script>
</body>
</html>
命名注意  my-component  可以  myComponent 不可以  mycomponent可以但不规范
<my-component v-for="item in items" v-bind:value="item"></my-component>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!--    <script src="../js/vue.js"></script>-->
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
</head>
<body>
<div id="app">
       //v-bind:value="item"  绑定 items 数组中遍历出来的值item,即每一项
    <my-component v-for="item in items" v-bind:value="item"></my-component>

</div>


<script>
    // 定义component组件
    Vue.component("my-component", {
               //props 将Vue的数据推送给template
        props: ['value'],
        template: '<li>{{value}}</li>'
    });
    var vm = new Vue({
        el: '#app',
        data: {
            items: ["java", "javafx", "vue"]
        }
    });
</script>
</body>
</html>