<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      js框架:vue3

      一個前端網頁有:HTML,js,css三個部分主組成,高級一點的動態頁就外加后臺代碼。
      vue:是JavaScript封裝起來的框架【js---》jQuery---》vue框架】,js就JavaScript的簡寫,其框架作用就是控制html標簽,給他數據獲取數據。

      一、指令的使用和數據的綁定

      首先vue需要先引入包服務

      <script src="https://unpkg.com/vue@3"></script>

      創建時需要一個實例:vue.createApp({ }) 并且這個實例一直存在。演示數據的單向和雙向綁定

      <div id="app"><img v-bind:src="photoUrl" width="50">
          {{list.name}}----{{list.photoUrl}}
      <p><input v-model = "text1"> {{text1}}</p>
      </div>
      <script>
          Vue.createApp({
            data() {
              return {
                photoUrl: "https://ts1.cn.mm.bing.net/th/id/R-C.171e8fe1aa1544a1868ab710eed82d82?rik=FLPxvVVL9C9bnQ&riu=http%3a%2f%2fwww.pp3.cn%2fuploads%2fallimg%2f200710%2f14-200G00Z321.jpg&ehk=Lb0IHCCZIdqYQOi28m%2borU8c1ARGbTEC%2f8WYzfwRuHo%3d&risl=&pid=ImgRaw&r=0",
                list:{name : "張三","photoUrl":"單向綁定數據用v-bind:src,簡寫【:src】"},
                text1:"雙向綁定v-model,可以動態改變數據"
              }
            }
          }).mount('#app')
      </script> 

      事件綁定v-on:事件名="方法名",【v-on:可以簡寫為@】如:v-on:click = "update" -----》@click = "update"

      <div id="app">
      <p><input v-model = "text1"> {{text1}}</p>
      <button v-on:click = "update">單擊事件修改</button>
      <button @click.once = "update">可以在事件后面點修飾符,once表示只能單擊一次</button>
      </div>
      <script>
          Vue.createApp({
            data() {
              return {
                text1:"雙向綁定v-model,可以動態改變數據"
              }
            },
            methods:{
              update(){
                this.text1 ="這里是給單擊事件添加的方法"
                debugger //是斷點f12調試,這里用來測試單擊事件的修飾符once
              }
            }
          }).mount('#app')
      </script>  

      指令:v-for循環和v-if條件判斷

      <div id="app">
        <table border="1"><!--邊框為1-->
          <tbody>
            <div v-if="students.length==0">
              <h1 style="color: red;">沒有數據!</h1>
            </div>
            <div v-else><!--for循環里有個排序屬性:key是排序,一般根據數據庫id排序如,:key="students.id"-->
              <tr v-for="(list,index) in students" :key="index"><!--根據索引下標排序-->
                <td>{{list.name}}</td>
                <td>{{list.sex}}</td>
                <td>{{list.age}}</td>
              </tr>
            </div> 
          </tbody>
        </table>
      </div>
      <script>
          Vue.createApp({
            data() {
              return {
                students:[{
                  name : "張三",
                  sex:"",
                  age:20  
                },{
                  name:"李四",
                  sex:"",
                  age:18         
                }]
              }
            }
          }).mount('#app')
      </script> 

      計算屬性computed和方法methods的區別

      <div id="app">
        <p>a+b={{a+b}}</p> <!--不提倡用表達式-->
        <p>a+b={{count}}</p> <!--計算屬性的調用-->
        <p>a+b={{count2()}}</p> <!--方法的調用-->
      </div>
      <script>
          Vue.createApp({ //代碼里叫組件,標簽調用叫指令如:v-if判斷等等
            data() { //組件data選項:用于存放數據的。
              return {
                a:5,b:10
              }
            },
            methods:{//方法:無緩存,每次調用都會執行一邊方法體。
              count2(){//調用時需要帶括號:count2()
                return this.a + this.b
              }
            },
            computed:{//計算屬性:有緩存,不會反復調用
              count(){//調用時不需要括號,只需要方法名count
                return this.a + this.b
              }
            }
          }).mount('#app')
      </script>   

      二、項目構建工具vue CLI(俗稱:腳手架)

      1.轉譯(Babel):因為現在瀏覽器無法支持這么高的語法,所以有了轉譯工具(高轉低)將(es6-es11)轉(es5)或者更靠前的低版本。
      2.代碼質量(ESlint):每個人都有自己的代碼風格,這個工具可以管理代碼風格。
      3.單文件組件(SFC):組件=模板+js+css
      4.代碼壓縮和優化:作用是將模板轉為js代碼進行編譯。(模板就是指html的標簽代碼)
      vue CLI 就是集成了上面4種工具一起的整合。需要下載安裝:Node.js 環境。node運行時面有個下載庫,叫npm,cnpm,npx,yarn等等,都是包管理器不必了解太多能用就行。
      安裝命令:
      因為node默認是國外環境,需要改回國內淘寶鏡像:npm config set registry https://registry.npm.taobao.org 
      安裝腳手架【vue cli】構建工具:npm install -g @vue/cli 
      創建項目:vue create projectname (注意:創建路徑不能有中文和特殊符號,projectname是自定義項目名)
      注意計算機為了安全考慮,把腳本分四個策略:
      1.Restricted(默認策略):禁止運行任何腳本和配置文件。
      2.AllSigned :可以運行腳本,但要求所有腳本和配置文件由可信發布者簽名,包括在本地計算機上編寫的腳本。
      3.RemoteSigned :可以運行腳本,但要求從網絡上下載的腳本和配置文件由可信發布者簽名; 不要求對已經運行和已在本地計算機編寫的腳本進行數字簽名。
      4.Unrestricted :可以運行未簽名腳本。(危險!)
      當我們創建不了vue項目工具時,就需要查一下策略:Get-ExecutionPolicy 返回策略名

      set-ExecutionPolicy RemoteSigned一定要把策略更改為RemoteSigned 策略才能創建vue構建工具
      創建時選擇vue3默認就可以,確認后

      創建完成后:進入項目
      cd projectname 運行項目:npm run serve 這里工具項目創建提示來執行,并非一定是這兩個命令

      最后有這樣一搞地址就表示成功了


      三、組件components

      每個網頁都是通過組件劃分的,顧名思義組件如同母版頁和布局頁。
      組件基礎:注冊的組件名以標簽顯示,注意中間要加【-】一杠。

      <div id="app">
          <h1>{{text}}</h1>
          <button-Component></button-Component>
      </div>
      <script>
          const ButtonComponent={//創建組件,必須在注冊之前定義
              data(){
                  return{msg:"我是子組件"}
              },//需要創建html標簽一起打包帶走
              template:`<button>{{msg}}</button>` //反引號是~線下面那個符號
          }
          Vue.createApp({
              data(){
                  return{text:"我是父組件!"}
              },
              //組件范圍注冊(只在當前實例里使用)
              components:{
                  ButtonComponent:ButtonComponent//頁面要使用的組件名:定義的組件名
              }
          }).mount('#app')
      </script>

      全局注冊組件

      const APP = Vue.createApp({
          data(){
              return{text:"我是父組件!"}
          }
      })//'頁面要使用的組件名',定義的組件名
      APP.component('buttonComponent',ButtonComponent)
      APP.mount('#app')

      vue cli 腳手架:組件關聯




      1.父組件向子組件參數傳遞,用標簽屬性傳

      <HelloWorld msg="傳給子組件的值"/>

      用【props】選項了接收。兩種寫法,變量在子組件上使用

      <script>
      export default { //default以整個文件導出,不加就是以單對象導出
        name: 'HelloWorld',//導出的名字,引入時需要用
        props: {//接收父組件向子組件傳遞過來的數據
          //msg: String //變量名:數據類型
          msg:{ //方法二
            type:String,
            required:true,//表示必須傳值過來
            default:"默認值"
          }
        }
      }
      </script>

      2.子組件向父組件參數傳遞,用【$emit()】方法來傳遞數據。

      <button @click="test()" >點擊按鈕</button>
      <script>
      export default { //default以整個文件導出,不加就是以單對象導出
        name: 'HelloWorld',//導出的名字,引入時需要用
        methods:{
          test(){//子組件需要調用方法才能執行數據保存,這里用單擊數據觸發方法
            this.$emit('search',"傳給父組件的數據")
          }
        }
      }
      </script>

      簡寫

      <button @click="$emit('search','傳給父組件的數據')" >點擊按鈕</button>

      父組件接收用自定義標簽屬性,屬性名search是自定義的

      <template>
        <img alt="Vue logo" src="./assets/logo.png">
        <HelloWorld msg="Welcome to Your Vue.js App" @search="onSearch"/>
      </template>
      
      <script>
      import HelloWorld from './components/HelloWorld.vue' //導入子組件
      
      export default {//父組件導出
        name: 'App',//父組件名
        components: { //注冊子組件
          HelloWorld  //導入進來的子組件名
        },
        methods:{
          onSearch(info){//此時info就是子組件傳遞過來的數據了
            console.log(info);//打印到控制臺
          }
        }
      }
      </script>

       插槽【slot】標簽,子組件用于封裝父組件傳過來的模板內容,父組件標簽內容會在子組件slot插槽中顯示出來。

      命名插槽【v-slot】指令:用于封裝多個插槽

      樣式scoped屬性表示只在單組件生效,其他組件無效。

      四、選項式API和組合式API的語法 

      選項式API

      <div id="app">
          <h1 @click="add">{{count}}*3={{three}}</h1>
      </div>
      <script>
          Vue.createApp({
              data(){//用于存放數據的選項
                  return{ count:1}
              },
              methods:{//用于定義方法的選項
                  add(){this.count++}
              },
              computed:{//計算屬性的選項
                  three(){return this.count*3}
              }
          }).mount('#app')
      </script>

      組合式API--------代碼內容寫setup方法里

      <div id="app">
          <h1 @click="add">{{count}}*3={{three}}</h1>
      </div>
      <script>
          //import {createApp} from 'vue' //以文件方式導入方法,我用的是vue網頁鏈接,所以這里不用導入
          const {ref,reactive,computed,createApp}=Vue //把Vue對象給這些方法,這些方法就有了等同于可創建對象的實例。
          createApp({//創建實例
              setup(){
                  const count=ref(1)//ref用于包裝成變量,復雜的ref({const:1})
                  const list=reactive({name:"張三",age:18})//和ref一樣,不過用于封裝復雜對象
                  function add(){//這里不能用this,因為數據封裝在ref方法里了
                      count.value++//ref需要點value,reactive不需要
                  }
                  const three = computed(()=>count.value*3)//計算屬性
                  return{count,add,three}//這種寫法需要返回數據,頁面才能顯示
              }      
          }).mount('#app')
      </script>

      組合式API簡寫<script setup>語法糖------------不需要return返回值了;vue3語法新特性:只能用于組件vue文件,是給模板template去使用的,不能用于常規的<script>標簽。

      <template>
      <h1 @click="add">{{count}}*3={{three}}</h1>
      </template>
      
      <script setup>
          import {ref,computed} from 'vue' //引入對象
                
          const count=ref(1)//ref用于包裝成變量,復雜的ref({const:1})
          function add(){//這里不能用this,因為數據封裝在ref方法里了
              count.value++//ref需要點value,reactive不需要
          }
          const three = computed(()=>count.value*3)//計算屬性    
      </script>

       五、路由【vue-router】

      安裝路由命令:npm install vue-router

      在【src】目錄下創建路由文件夾【router】和【index.js】路由配置文件。這些手動配置的時候是可以自動創建的,學習所以手動創建配置

      import { createRouter,createWebHistory } from "vue-router";//引入創建路由和路由模式兩個方法
      import HelloWorld from '../components/HelloWorld.vue'//引入組件,靜態導入每次都會跟整個程序一起加載。
      const routes=[//定義路由
          {
              path:'/hello',
              name:'hello',
              component:HelloWorld //組件
          },
          {
              path:'/home',
              name:'home',
              component:()=>import('../components/HomeCom.vue')//動態導入,建議使用
          }
      ]
      const router =createRouter({ //創建路由
          history:createWebHistory(),//路由模式
          routes:routes//可以簡寫
          //routes //定義的路由
      })
      
      export default router //導出給入口main.js用

      然后在【main.js】入口js文件中,通過use方法將路由掛載到項目中

      import { createApp } from 'vue' //引入vue實例化方法
      import App from './App.vue' //導入組件
      import router from './router/index' //導入路由js文件
      
      createApp(App).use(router).mount('#app') //use方法將路由router掛載到實例

      隨便創建幾個組件充當需要跳轉的測試頁面【HomeCom.vue】等等

      <template>
       <h1>Home 頁</h1>
      </template>
      
      <script>
          export default { //default以整個文件導出,不加就是以單對象導出
              name: 'HelloWorld'
          }
      </script>

      最后在【App.vue】父組件中添加需要跳轉的標簽【RouterLink】和顯示標簽<router-view />

      <template>
        <img alt="Vue logo" src="./assets/logo.png">
        <!-- <HelloWorld msg="Welcome to Your Vue.js App" @search="onSearch" /> -->
      
        <nav><!-- nav標簽用來定義導航連接的標識 -->
          <RouterLink to="/hello">hello</RouterLink> | <!-- 跳轉路由標簽,相當于a標簽 -->
          <RouterLink :to="{name:'home',query:{id:1}}">Home</RouterLink> | <!--冒號表示指令跳轉,query表示以連接形式傳遞參數,params以路由參數傳遞,跳轉用name或path -->
          <button @click="nav()">首頁</button> <!--根據方法跳轉,方法定義在js--></nav>
        <!-- 顯示路由內容標簽Router-View -->
        <RouterView></RouterView>
      </template>
      
      <script>
      // import HelloWorld from './components/HelloWorld.vue' //導入子組件
      
      import { useRouter } from 'vue-router';
      
      export default {
        name: 'App',//父組件名
        components: { //注冊子組件
          //HelloWorld  
        },
        setup(){
          const router=useRouter()
          function nav(){
            //router.push('/')//跳轉到首頁,默認是路由的path
            //router.push({name:'home'})//路由name屬性跳轉
            //router.replace({name:'home'})//跳轉后不能返回上一層,push可以返回上一層
            router.go(-1)//-1表示返回上一頁,1表示跳轉下一頁,瀏覽器的<-和->
          }
          return{nav}
        }
      }
      </script>
      
      <style>
      #app {
        font-family: Avenir, Helvetica, Arial, sans-serif;
        -webkit-font-smoothing: antialiased;
        -moz-osx-font-smoothing: grayscale;
        text-align: center;
        color: #2c3e50;
        margin-top: 60px;
      }
      </style>

      演示效果圖

      六、狀態管理【vuex】----相當于全局變量

      安裝命令:npm install vuex
      在【src】目錄下創建【store】文件夾下新建【index.js】的配置文件

      import { createStore } from "vuex"
      
      export default createStore({
          state:{//定義狀態變量(可以是如何類型)
              strname:'張三',
              list:[{
                  id:11,
                  name:'李四'
              },{
                  id:22,
                  name:'王五'
              }]
          },
          mutations:{//需要通過方法來間接修改狀態,后臺全局變量可以直接修改數據,vuex不行
              setStrName(state,name){//第一個參數傳狀態變量
                  state.strname = name
              }
          },
          getters:{//vuex的就是屬性,自帶緩存效果
              count:state=>state.list.length //計算出數組長度
          },
          actions:{//異步修改,也是做修改的
              //mutations是間接修改
          }
      })

      將配置文件掛載到【main.js】入口文件

      import { createApp } from 'vue' //引入vue實例化方法
      import App from './App.vue' //導入組件
      import router from './router/index' //導入路由js文件
      
      import store from './store/index' //導入狀態變量vuex---類似全局變量
      
      createApp(App).use(router).use(store).mount('#app') //use方法掛載到實例,全局都可以用

      頁面調用

      <template>
          <h1>Home 頁:{{strName}}</h1>
          <input type="=text" @input="updateName" :value="strName">
          <h1>數組長度:{{count11}}</h1>
      </template>
      
      <script>
          import { computed } from 'vue'//計算屬性,獲取vuex的數據需要通過計算屬性來獲取。
          import { useStore } from 'vuex'//用來創建對象
          export default { //default以整個文件導出,不加就是以單對象導出
              name: 'HelloWorld',
      
              setup(){//組合式api
                  let store=useStore()//定義變量,創建狀態管理變量的對象,let定義的變量出大括號不能使用此變量。
                  const strName = computed(()=>store.state.strname)//通過計算屬性獲取數據
                  
                  function updateName(event){//修改方法:用commit()提交數據,參數1:配置文件定義的修改方法
                      store.commit("setStrName",event.target.value)//參數2:獲取標簽的value值
                  }
                  //調用vuex的計算屬性,const定義的變量表示常量
                  const count11=computed(()=>store.getters['count'])//.getters.count等價于.getters['count']
      
                  return{
                      strName,//將變量返回給頁面顯示
                      updateName,//修改方法
                      count11 //數組長度
                  }
              }
          }
      </script>

       區別:1、全局變量數據可直接修改,而vuex需要通過定義方法來間接修改(不好跟蹤)。2、vuex是響應式數據,修改時所以地方全部修改;全局變量做不到。

      七、UI庫

      是配合vue3快速搭建的模板:一個 Vue 3 UI 框架 | Element Plus (gitee.io)
      安裝命令:npm install element-plus --save

       

      posted @ 2022-11-27 04:31  Akai_啊凱  閱讀(267)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产在线午夜不卡精品影院| 性欧美老妇另类xxxx| 亚洲精品无amm毛片| 国产最新AV在线播放不卡| 大陆精大陆国产国语精品| 青草青草久热国产精品| 色老头亚洲成人免费影院| 亚洲丶国产丶欧美一区二区三区| 99久久国产成人免费网站| 亚洲18禁私人影院| 中文字幕亚洲综合久久| 91麻豆精品国产91久| 无码国产欧美一区二区三区不卡| 欧美一区二区三区久久综合| 一区二区三区四区国产综合| 视频一区二区三区四区五区 | аⅴ天堂中文在线网| 人妻精品动漫H无码中字| 在线无码午夜福利高潮视频| 亚洲欧美日韩尤物AⅤ一区| 综合偷自拍亚洲乱中文字幕| 国产精品免费第一区二区| 中文有无人妻vs无码人妻激烈| 天美传媒一区二区| 日韩精品卡一卡二卡三卡四| 国产成人无码免费网站| 葫芦岛市| 久青草视频在线观看免费| 国产高清在线不卡一区| 日韩精品 中文字幕 视频在线 | 日本一卡2卡3卡四卡精品网站| 亚洲精品理论电影在线观看| 欧洲亚洲精品免费二区| 日韩不卡在线观看视频不卡| 99e久热只有精品8在线直播| 国产精品中文字幕免费| 久青草国产综合视频在线| 国产老熟女国语免费视频| 一区二区三区鲁丝不卡| 国产台湾黄色av一区二区| 亚洲天堂伊人久久a成人|