day6_vue

day6_vue

1es6新语法

1.1模块化语法

    1.模块化语法

    默认导出   export default areaData
    默认导入   import 导入对象别名 from './js/myData.js'
     
               只能导一个对象

    命名导入   export {myTest,areaData}
    命名导出   import {myTest,areaData} from './js/myData.js'  
    
              可以导入导出多个对象

js文件导出

//导出json对象


//export default myTest

export {myTest,areaData}

html文件导入

<script type="module">  //需要支持模块化语法
	//import  导入
   //export  导出
   import areaData from './js/myData.js'

   import {myTest,areaData} from './js/myData.js'
    console.log("通过模块化导入");
    console.log(myTest);
    console.log(areaData);
</script>
1.2箭头函数
   //2箭头函数 ()=>{}
   /*
      定时函数
      数组.forEach

    //定义函数的写法
    const myFun = (num1,num2)=>{
        console.log(num1+num2);
    }
1.3json对象修饰符
	//3json对象 使用const修饰
    let   临时变量时使用   
    //const 修饰对象时 不能通过=赋值 但是对象的内容可以操作和改变
    const myJson = {name:'jack',age:15};
    //myJson = {name:'rose'}
    myJson.name = "rose"
    console.log(myJson);

注意:函数 json对象 一般都用const修饰 临时变量再用let

2vue原理

1响应式数据原理

2虚拟dom

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1 id="mytitle"></h1>
    <input id="myarea" type="text"/>
</body>

<script>

    /*响应式数据原理*/
    // vue2响应式数据原理 数据劫持 Object 扩展属性时 改 get set的实现 把dom操作隐藏在其中
    // vue3  数据劫持 简单数据类型  字符串 数字 bol     ref       简单数据类型 复杂数据类型
    //       代理对象 复杂数据类型  对象 数组           reactive  复杂数据类型 
    let myJson = {name:"jack"}
    // //myJon.age = 15
    // Object.defineProperty(myJson,'age',{
    //     get(){
    //         console.log("我要读取age的属性");
            
    //     },
    //     set(val){
    //         console.log("我要给age的属性赋值"+val); 
    //         document.getElementById("mytitle").innerHTML = val
    //     }
    // })

    // //console.log(myJson);
    // myJson.age = 55
    let newJson = new Proxy(myJson,{
        get(target,prop){
            console.log(`尝试读取${prop}的值`);
            
        },
        set(target,prop,val){
            console.log(`尝试给${prop}赋值${val}`);
            if(prop == 'age'){
                document.getElementById("mytitle").innerHTML = val
            }
            if(prop == 'addr'){
                document.getElementById("myarea").value = val
            }
            
        }
    })
    // newJson.age=15
    // console.log(myJson);
    // console.log(newJson);
    newJson.age=15
    newJson.addr="科学大道1111"


    /*虚拟dom*/
    //html解析器 css解析器 js解析器
    //逐行解释执行  如果有类似垃圾代码多 会造成页面卡顿
    document.getElementById("mytitle").innerHTML = 1
    document.getElementById("mytitle").innerHTML = 2
    document.getElementById("mytitle").innerHTML = 3
    



</script>

</html>

3vue中js代码写法和规范

页面中需要提供根标签 vue会根据根标签中的内容 生成虚拟dom 并只对根标签中的内容生效

    <div id="app">
        <h1>{{myname}}</h1>
        <div>姓名:{{myObj.name}}</div>
        <div>年龄:{{myObj.age}}</div>
    </div>

1.js代码中 需要引入vue的js 并创建vue对象

2.在setup函数中 检测vue需要使用的函数和变量 并通过数据劫持 或代理对象 生成响应式数据与页面元素的关联关系

3.setup函数中的变量和函数 如果需要在div中使用 需要通过return的json对象对外暴漏

    import { createApp, ref,reactive } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'
    //创建vue对象
    createApp({
        setup(){
            //设置vue参数
            /*
            响应式变量规则
            1 简单数据类型  字符串 数字 bol   ref()
            2 复杂数据类型  对象 数组         reactive()

            3 关键字  响应式数据 都会转成对象 const修饰
                      临时变量              let修饰

            */

            //创建变量  创建函数
            //只有初次渲染生效
            const myname = ref("小明")
            console.log(myname);
            const myObj = reactive({name:'隔壁老王',age:55})
            console.log(myObj);

                


            return {
                //对外暴漏 变量 函数
                myname,myObj
            }

        }
    }).mount('#app')

1.js代码中不再写dom操作了

2.把函数 变量... 都写入到setup函数中 并对外暴漏

安装vue插件

image-20250731114848633

4vue模板语法

1插值表达式 {

在需要显示文本的部分 使用vue中的变量

         插值表达式 {{}}
         1基本作用  显示纯文本
         2支持简单的代码处理   {{'亲爱的'+username}}
         3支持函数处理         {{transName()}}

        innerText

         v-html 支持html解析
        innerHTML 可以识别标签
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .mystyle{
            border: 1px solid  black;
            background-color: aquamarine;
        }


    </style>
</head>
<body>
    <div id="app">
        <div>欢迎:<span class="mystyle">{{username}}</span>登录</div>
        <hr>
        <div v-html="username2"></div>

    </div>
    
</body>
<script type="module">

    /*
         插值表达式 {{}}
         1基本作用  显示纯文本
         2支持简单的代码处理   {{'亲爱的'+username}}
         3支持函数处理         {{transName()}}

        innerText

         v-html 支持html解析
        innerHTML 可以识别标签



    */
    import { createApp, ref,reactive } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'
    createApp({
        setup(){
            const username = ref('rose')

            const username2 = ref('j<b>ac</b>k')
            const transName = ()=>{
                if(username.value == 'rose'){
                    return "肉丝"
                }
            }

            return {
                username,transName,username2
            }

        }
    }).mount('#app')



</script>
</html>

2v-bind属性绑定

        v-bind:属性=""
        让变量与属性关联   
        1.直接使用变量
        2.支持表达式
        3.配合函数 做复杂数据处理

        属性绑定时  属性值 主要是字符串
                   特殊属性 disabled  readonly  用bol值

        注意: v-bind:属性="" 简写: :属性=""
        了解:
        class属性 支持普通处理方式  以字符串 控制样式值
        也支持进阶控制 每个央视通过bol值动态控制
        :class="{'cls1':clsStatus1,'cls2':clsStatus2,'cls3':clsStatus3}"
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <style>
        .cls1{
            width: 100px;
            height: 100px;
            border: 1px solid black;
        }

        .cls2{
            background-color: blueviolet;
        }

        .cls3{
            color: brown;
        }

    </style>
</head>
<body>
    <div id="app">
        <input :type="inputType" :value="username"  :disabled="btnStatus"/>

        <!-- <div :class="{'cls1':clsStatus1,'cls2':clsStatus2,'cls3':clsStatus3}"> -->
        <div  class="cls1" :class="mycls"  >
            testdiv
        </div>

    </div>
    
</body>
<script type="module">

    /*
        v-bind:属性=""
        让变量与属性关联   
        1.直接使用变量
        2.支持表达式
        3.配合函数 做复杂数据处理

        属性绑定时  属性值 主要是字符串
                   特殊属性 disabled  readonly  用bol值

        v-bind:属性="" 简写: :属性=""

        了解:
        class属性 支持普通处理方式  以字符串 控制样式值
        也支持进阶控制 每个央视通过bol值动态控制
        :class="{'cls1':clsStatus1,'cls2':clsStatus2,'cls3':clsStatus3}"

    */

    import { createApp, ref,reactive } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'
    createApp({
        setup(){
            const username = ref('rose')
            const inputType = ref('text')

            const btnStatus = ref(false)

            // const divcls = ref('cls2 cls3 cls1 ')
            //,divcls
            const clsStatus1 = ref(true)
            const clsStatus2 = ref(false)
            const clsStatus3 = ref(true)

            const mycls = ref('cls2')

            return {
                username,inputType,btnStatus,clsStatus1,clsStatus2,clsStatus3,mycls
            }

        }
    }).mount('#app')


</script>

</html>

3v-if 分支指令

        v-if  通过条件分支 控制页面显示

        单分支    v-if="bol值"  

        双分支    v-if="bol值"
                 v-else   

        多分支    v-if="xxx=xxx"
                 v-else-if="xxx=xxx"
                 v-else-if="xxx=xxx"
                 v-else
    
      
        v-show   控制显示/隐藏  display:none
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">

        正常访问看到的页面数据
        <div v-if="isLogin">
            精彩的付费内容.....
         </div>
         <div v-show="isLogin">
            精彩的付费内容.....
         </div>
        <!-- 
        <div v-else >
           内容预览 充值之后看完整内容....... 
        </div> -->
        <!-- <div v-if="vipGrade == 1">
            普通小姐姐跳舞
         </div>
         <div v-else-if="vipGrade == 2">
            高级小姐姐跳舞
         </div>
         <div v-else-if="vipGrade == 3">
            顶级小姐姐跳舞
         </div>
         <div v-else>
            大D小姐姐跳舞
         </div> -->

    </div>
</body>
<script type="module">

    /*
        v-if  通过条件分支 控制页面显示

        单分支    v-if="bol值"  

        双分支    v-if="bol值"
                 v-else   

        多分支    v-if="xxx=xxx"
                 v-else-if="xxx=xxx"
                 v-else-if="xxx=xxx"
                 v-else
    
        v-show   控制显示/隐藏  display:none

    */

        import { createApp, ref,reactive } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'
        createApp({
            setup(){
                const isLogin = ref(false)
                const vipGrade = ref(4)//1普通会员 2高级会员 3顶级会员 4私密会员
                return {
                    isLogin,vipGrade
                }

            }
        }).mount('#app')



</script>
</html>

4v-on事件绑定


    1 函数需要定义在setup函数中 并对外暴漏
    2 onclick ====  @click
    3 调用的函数 如果不传参 可以不加括号
      @click="myFun"
    

    注意:
        如果通过触发的函数 要改变页面中的数据(与事件绑定的函数) 
        需要对外暴漏 操作的数据 需要用响应式数据 ref reactive

        如果程序运行过程中的公共函数 没有与页面绑定 不需要对外暴漏 可以直接使用
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <h1>欢迎:{{username}}登录</h1>

        <button @click="myFun">点我</button>

    </div>
</body>
<script type="module">
    /*
    1 函数需要定义在setup函数中 并对外暴漏
    2 onclick ====  @click
    3 调用的函数 如果不传参 可以不加括号
      @click="myFun"
    

    注意:
        如果通过触发的函数 要改变页面中的数据(与事件绑定的函数) 
        需要对外暴漏 操作的数据 需要用响应式数据 ref reactive

        如果程序运行过程中的公共函数 没有与页面绑定 不需要对外暴漏 可以直接使用

    */


        import { createApp, ref,reactive } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'
        createApp({
            setup(){
                //不支持初次渲染之后的变化
                //let username = 'jack'
                //需要使用响应式变量
                const username = ref('jack')
                const myFun = ()=>{
                    console.log("运行了....");
                    username.value = 'rose'

                    getSum(1,2)

                }

                const getSum =(num1,num2)=>{
                    console.log(num1+num2);
                    
                }

                return {
                    myFun,username
                }

            }
        }).mount('#app')
</script>
</html>

5v-model双向绑定

    单向绑定
    model       -------- >       view
    
    表单元素
    model     < -------- >       view
    v-model
    输入类
    v-model 代替value属性
    <input type="text" v-model="textVal"/>

    选择类
    radio
    v-model 分组  可以控制默认值  
    const gender = ref('3')
    当用户改变选项时 gender值会变化

    <input v-model="gender" type="radio" value="1" />男
    <input v-model="gender" type="radio" value="2" />女
    <input v-model="gender" type="radio" value="3" />女装大佬

    checkbox
    v-model 分组  可以控制默认值  
    const hobby = ref([2])
    当用户改变选项时 hobby值会变化
    <input v-model="hobby" type="checkbox" :value="1+''"/>唱歌
    <input v-model="hobby" type="checkbox" :value="2"/>跳舞
    <input v-model="hobby" type="checkbox" :value="'3'"/>打篮球

    下拉列表
    v-model 可以控制默认值
    const area = ref('')
    当用户改变选项时 area值会变化
        <select v-model="area">
            <option value="" disabled>---------请选择----------</option>
            <option value="001">中国</option>
            <option value="002">韩国</option>
            <option value="003">泰国</option>
        </select>

注意:

html元素属性值类型时字符串 如果想控制数据类型 可以做成属性绑定 
         :value="2"   数字
         :value="'2'" 字符串
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <input type="text" v-model="textVal"/>
        <button @click="changeText">改变数据</button>
        <button @click="getText">读取数据</button>
        <hr>
        性别: <input v-model="gender" type="radio" value="1" />男
             <input v-model="gender" type="radio" value="2" />女
             <input v-model="gender" type="radio" value="3" />女装大佬
        {{gender}}
        <hr>
            <input v-model="hobby" type="checkbox" :value="1+''"/>唱歌
            <input v-model="hobby" type="checkbox" :value="2"/>跳舞
            <input v-model="hobby" type="checkbox" :value="'3'"/>打篮球
        {{hobby}}
        <hr>
        <select v-model="area">
            <option value="" disabled>---------请选择----------</option>
            <option value="001">中国</option>
            <option value="002">韩国</option>
            <option value="003">泰国</option>
        </select>
        {{area}}

    </div>
</body>
<script type="module">

    /*
    单向绑定
    model     -------- >       view
    
    表单元素
    model     <-------- >       view
    

    v-model
    输入类
    v-model 代替value属性
    <input type="text" v-model="textVal"/>

    选择类
    radio
    v-model 分组  可以控制默认值  
    const gender = ref('3')
    当用户改变选项时 gender值会变化

    <input v-model="gender" type="radio" value="1" />男
    <input v-model="gender" type="radio" value="2" />女
    <input v-model="gender" type="radio" value="3" />女装大佬

    checkbox
    v-model 分组  可以控制默认值  
    const hobby = ref([2])
    当用户改变选项时 hobby值会变化
    <input v-model="hobby" type="checkbox" :value="1+''"/>唱歌
    <input v-model="hobby" type="checkbox" :value="2"/>跳舞
    <input v-model="hobby" type="checkbox" :value="'3'"/>打篮球

    下拉列表
    v-model 可以控制默认值
    const area = ref('')
    当用户改变选项时 area值会变化
        <select v-model="area">
            <option value="" disabled>---------请选择----------</option>
            <option value="001">中国</option>
            <option value="002">韩国</option>
            <option value="003">泰国</option>
        </select>


    注意: html元素属性值类型时字符串 如果想控制数据类型 可以做成属性绑定 
         :value="2"   数字
         :value="'2'" 字符串
    */

        import { createApp, ref,reactive } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'
        createApp({
            setup(){
                const textVal = ref('jack')
                const changeText = ()=>{
                    textVal.value = 'rose'
                }
                

                const getText = ()=>{
                    console.log(textVal.value);
                    
                }

                const gender = ref('3')
                const hobby = ref([2])
                
                const area = ref('')

                return {
                    textVal,changeText,getText,gender,hobby,area
                }

            }
        }).mount('#app')


</script>
</html>

6遍历指令

    v-for 遍历集合 生成dom元素
    简化写法
    <li v-for="遍历到的元素 in 集合">{{遍历到的元素.属性}}</li>
    完整写法
    <li v-for="(myNews,idx) in newsList" :key="idx">{{idx}}----{{myNews.content}}</li>

    遍历时读取动态数据的方式
    纯文本动态写入 {{myNews.xxx}}
    属性动态写入   :属性="myNews.xxx"
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <ul>
            <!-- <li v-for="myNews in newsList">{{myNews.content}}</li> -->
            <li v-for="(myNews,idx) in newsList" :key="idx">{{idx}}----{{myNews.content}}</li>
        </ul>
        <table border="1">
            <tr>
                <th>姓名</th>
                <th>年龄</th>
                <th>住址</th>
            </tr>
            <tbody>
                <tr v-for="stu in stuList">
                    <td>{{stu.name}}</td>
                    <td>{{stu.age}}</td>
                    <td>{{stu.addr}}</td>
                </tr>
            </tbody>
        </table>

        <select v-model="currentArea">
            <option value="">---------请选择----------</option>
            <option v-for="area in areaList" :value="area.code">{{area.name}}</option>
        </select>
        {{currentArea}}

    </div>
</body>
<script type="module">
    /*
    v-for 遍历集合 生成dom元素
    <li v-for="遍历到的元素 in 集合">{{遍历到的元素.属性}}</li>
    完整写法
    <li v-for="(myNews,idx) in newsList" :key="idx">{{idx}}----{{myNews.content}}</li>

    遍历时读取动态数据的方式
    纯文本动态写入 {{myNews.xxx}}
    属性动态写入   :属性="myNews.xxx"

    */
    
    import { createApp, ref,reactive } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'
        createApp({
            setup(){

                let newsList = [{content:'新闻1'},{content:'新闻2'},{content:'新闻3'}]
                let stuList = [ {name:'小明',age:15,addr:'科学大道1号'}
                                ,{name:'小光',age:25,addr:'溜光大道1号'}
                                ,{name:'小亮',age:35,addr:'光溜大道1号'}]
                let areaList = [{name:'河南',code:1},{name:'河北',code:2},{name:'山东',code:3},{name:'山西',code:4}]
                
                let currentArea = ref('')
                return {
                    newsList,stuList,currentArea,areaList
                }

            }
        }).mount('#app')


</script>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <select v-model="prov" @change="changeCityList">
            <option value="" disabled>---------请选择----------</option>
            <option v-for="provInfo in provList" :value="provInfo.code" >{{provInfo.name}}</option>
        </select>省
        <select v-model="city" @change="changeAreaList">
            <option value="" disabled>---------请选择----------</option>
            <option v-for="cityInfo in cityList" :value="cityInfo.code" >{{cityInfo.name}}</option>
        </select>市
        <select v-model="area">
            <option value="" disabled>---------请选择----------</option>
            <option v-for="areaInfo in areaList" :value="areaInfo.code" >{{areaInfo.name}}</option>
        </select>县区
        <hr>
        {{prov}}---{{city}}---{{area}}
    </div>

</body>

<script type="module">
    import { createApp, ref,reactive,onMounted,onUpdated } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'
    import areaData from '/day731_vue/js/myData.js'

    createApp({
            setup(){
                const prov = ref('')
                const city = ref('')
                const area = ref('')
                const provList = ref([])
                const cityList = ref([])
                const areaList = ref([])
                //记录切换中临时的城市列表
                let currentCityList = []

                //页面加载结束 加载省数据
                onMounted(()=>{
                    provList.value =  areaData
                })

                //切换省 换cityList
                const changeCityList = ()=>{
                    //选中请选择
                    city.value = ''
                    area.value = ''
                    //清空选项
                    areaList.value = []

                    areaData.forEach(provData=>{
                        //如果遍历到的省 与选中的省编号相同
                        if(provData.code == prov.value){
                            //找到了市列表
                            console.log(provData.city);
                            //给临时变量赋值 方便县区联动
                            currentCityList = provData.city
                            //给城市列表 动态生成选项 
                            cityList.value = provData.city 
                        }
                    })
                }
                //切换市 换areaList
                const changeAreaList = ()=>{
                     //选中请选择
                    area.value = ''

                    currentCityList.forEach(cityData=>{
                        if(cityData.code == city.value){
                            areaList.value = cityData.area
                        }
                    })
                }

                return {
                    prov,city,area,provList,cityList,areaList,changeCityList,changeAreaList
                }

            }
        }).mount('#app')


</script>
</html>

5vue生命周期

参考课件声明周期图

钩子函数:

在vue声明周期执行过程中 可以加入自定义代码 在vue到特定时机是执行自定义代码

onMounted() 这个钩子经常用来表示 页面加载结束 去后端加载数据

posted @ 2025-07-31 22:40  小胡coding  阅读(6)  评论(0)    收藏  举报