
<div class="box">
    <!-- 3. {{对象名}} 为插件表达式 插入vue实例数据 -->
    <h1>Hello, {{name.toUpperCase()}} {{age}}</h1>
</div>
// 1. 设置为false 以阻止vue在启动时生成生产提示
Vue.config.productionTip = false
// 最好在配置调整好后 在继续写Vue代码
// 2. 创建vue实例 {} 是配置对象
new Vue({
    el: '.box', // el是指定当前vue实例为哪个容器服务 值为css选择器
    data: { // data是存储数据的 为指定容器使用  
        name: '小城故事xc',
        age: 18
    }
})<div class="box">
    <h1>插值语法</h1>
    <h2>你好, {{name}}</h2>
    <hr>
    <h1>指令语法</h1>
    <a v-bind:href="url" v-bind:x="age">百度搜索</a>
    <!-- 简写指令 -->
    <a :href="url" :x="age">{{all.name}}</a>
</div>
new Vue({
    el: '.box',
    data: {
        name: 'jack',
        url: 'https://baidu.com',
        age: 18,
        all: {
            name: '小城故事'
        }
    }
})<div class="box">
    <!-- 普通写法 -->
    单项数据绑定: <input type="text" v-bind:value="name"><br>
    双项数据绑定: <input type="text" v-model:value="name"><br>
    <!-- 简写 -->
    单项数据绑定: <input type="text" :value="name"><br>
    双项数据绑定: <input type="text" v-model="name">
    <!-- 下面代码是错误的 v-model只能应用在表单元素上(输入类元素) -->
    <!-- <h2 v-model:x="name">你好</h2> -->
</div>
new Vue({
    el: '.box',
    data: {
        name: '小城故事'
    }
})let v = new Vue({
    // el: '.box', 
    data:function () {    // data函数式写法
        console.log(this) // 指向vue实例对象
        return {
            name: '小城故事'
        }
    }
})
// 01. el的两种写法
// 1. 第一种写法: el: '.box'
// 2. 第二种写法: $mount
console.log(v)
// 配合定时器使用
setTimeout(() => {
    v.$mount('.box')
}, 500)
// 02. data的两种写法
// 1. 第一种写法: 对象式 data: {}
// 2. 第二种写法: 函数式 组件化会用到<div class="box">
    <h1>你好, {{name}}</h1>
    <h4>测试一下: {{1+1}}</h4>
    <h4>测试一下: {{$options}}</h4>
    <h4>测试一下: {{$emit}}</h4>
</div>
let vm = new Vue({
    el: '.box',
    data: {
        name: '小城故事'
    }
})
console.log(vm)let num = 18
let obj = {
    name: '小城'
}
Object.defineProperty(obj, 'age', {
    // value: 18,
    // enumerable: true,  // 控制属性是否可以枚举 默认false
    // writable: true,    // 控制属性是否可以被修改 默认false
    // configurable: true, // 控制属性是否可以被删除 默认false
    // 数据代理 当读取obj的age属性时, get函数会被调用, 且返回值是age的值
    get() {
        console.log('你读取了age属性')
        return num
    },
    // 数据劫持 当修改obj的age属性时, set函数会被调用, 且会收到修改的具体指
    set(value) {
        console.log('你修改了age属性, 且值为', value)
        return num = value
    }
})
console.log(obj)
console.log(Object.keys(obj))let obj = {x: 10}
let obj1 = {y: 20}
Object.defineProperty(obj1, 'x', {
    get() {
        return obj.x
    },
    set(value) {
        obj.x = value
    }
})
console.log(obj)
console.log(obj1)<div class="box">
    <h1>你好, {{name}}</h1>
</div>
let vm = new Vue({
    el: '.box',
    data: {
        name: '小城故事'
    }
})
console.log(vm)<div class="box">
    <h1>你好, {{name}}</h1>
    <button v-on:click="show">点击我啊</button>
    <!-- 简写 -->
    <button @click="show">点击我啊 (不带传参)</button>
    <button @click="show1($event, 666)">点击我啊 (带传参)</button>
</div>   
el: '.box',
    data: {
        name: '小城故事'
    },
    methods: {
        show(e) {
            console.log(e.target)
            console.log(this) // 指向vm实例对象
            alert('你好')
        },
        show1(event, number) {
            console.log(event, number)
            alert(`你好, ${number}`)
        }
    }
})<div class="box">
    <h3>你好, {{name}}</h3>
    <!-- 1. 阻止事件默认行为(常用) -->
    <a href="https://baidu.com" @click.prevent="show">点我提示信息</a>
    <!-- 小技巧: 修饰符可以连续写入: 阻止默认行为和阻止冒泡 -->
    <a href="https://baidu.com" @click.prevent.stop="show">修饰符可以连续写入</a>
    <!-- 2. 阻止事件冒泡(常用) -->
    <div class="demo" @click="show">
        <button @click.stop="show">阻止事件冒泡</button>
    </div>
    <!-- 3. 事件只触发一次(常用) -->
    <button @click.once="show">点我只触发一次</button>
    <!-- 4. 使用事件的捕获模式 -->
    <div class="demo1" @click.capture="show1(1)">
        使用事件的捕获模式
        <div class="demo2" @click="show1(2)">
            使用事件的捕获模式
        </div>
    </div>
    <!-- 5. 只有e.target是当前操作的元素时才触发事件 -->
    <div class="demo" @click.self="show">
        <button @click="show">e.target阻止事件冒泡</button>
    </div>
    <!-- 6. 事件的默认行为立即执行, 无需等待事件回调完成 -->
    <ul @wheel.passive="show2">
        <li>1</li>
        <li>2</li>
    </ul>
</div>
new Vue({
    el: '.box',
    data: {
        name: '小城故事'
    },
    methods: {
        show(e) {
            // e.preventDefault() vue里这样写: prevent
            // e.stopPropagation() vue里这样写: stop
            alert('你好')
        },
        show1(msg) {
            console.log(msg)
        },
        show2() {
            for (let i = 0; i <= 100000; i++) {
                console.log(1)
            }
            console.log('累坏了')
        }
    }
})<div class="box">
    <h2>你好, {{name}}</h2>
    <input type="text" placeholder="按下回车提示" @keyup.enter="show">
    <!-- Ctrl虽然可配合其他键使用,但如果只能Ctrl+Y才能触发后面得.Y -->
    <input type="text" placeholder="按下回车提示" @keyup.ctrl.y="show">
</div>
new Vue({
    el: '.box',
    data: {
        name: '小城'
    },
    methods: {
        show(e) {
            // if (e.key !== 'Enter') return
            console.log(e.target.value)
        }
    }
})<div class="box">
    姓: <input type="text" v-model="name"> <br><br>
    名: <input type="text" v-model="names"> <br><br>
    全名: <span>{{name.slice(0, 3)}} - {{names}}</span>
</div>
new Vue({
    el: '.box',
    data: {
        name: '张',
        names: '三'
    }
})<div class="box">
    姓: <input type="text" v-model="name"> <br><br>
    名: <input type="text" v-model="names"> <br><br>
    全名: <span>{{fn()}}</span>
</div>
new Vue({
    el: '.box',
    data: {
        name: '张',
        names: '三'
    },
    methods: {
        fn() {
            console.log('fn函数被调用了')
            return this.name + '-' + this.names
        }
    }
})<div class="box">
    姓: <input type="text" v-model="name"> <br><br>
    名: <input type="text" v-model="names"> <br><br>
    全名: <span>{{fullname}}</span> <br><br>
    全名: <span>{{fullname}}</span> <br><br>
    全名: <span>{{fullname}}</span>
</div>
let vm = new Vue({
    el: '.box',
    data: {
        name: '张',
        names: '三'
    },
    computed: {
        fullname: {
    // get作用: 当读取fullname时, get会被调用, 且返回值作为fullname的值
            get() {
                console.log('get被调用了')
                console.log(this) // 指向vm实例 vue把get的this指向了vm
                return this.name + '-' + this.names
            },
    // set什么时候调用: 当fullname被修改时调用
            set(value) {
                console.log(value)
                let arr = value.split('-')
                this.name = arr[0]
                this.names = arr[1]
            }
        }
    }
})
console.log(vm)只有考虑读取, 不考虑修改才能用简写方式
<div class="box">
    姓: <input type="text" v-model="name"> <br><br>
    名: <input type="text" v-model="names"> <br><br>
    全名: <span>{{fullname}}</span>
</div>
let vm = new Vue({
    el: '.box',
    data: {
        name: '张',
        names: '三'
    },
    computed: {
        // 1. 简写
        fullname() {
            console.log('get被调用了')
            return this.name + '-' + this.names
        }
        // 2. 完整写法
        // fullname: {
        //     get() {
        //         console.log('get被调用了')
        //         return this.name + '-' + this.names
        //     }
        // }
    }
})