vue + element 總結 (vue-cli 2)


vue + element 總結 (vue-cli 2)

vue 數據插槽

### 默認插槽
// 當聲明一個組件 child-component
<div id="app">
    <child-component></child-component>
</div>
<script>
    Vue.component('child-component',{
        template:`
            <div>Hello,World!</div>
        `
    })
    let vm = new Vue({
        el:'#app',
        data:{

        }
    })
</script>
 // 如果想在<child-component></child-component>中自定義內容 
    // 比如 插值 字符串 組件  需要插槽 不然沒有效果如下
   
 Vue.component('child-component',{
        template:`
            <div>
            Hello,World!
			// 加上這一句才起作用
            <slot></slot>
            </div>
        `
    })

// 沒有插槽的情況下在組件標簽內些一些內容是不起任何作用的,當我在組件中聲明了slot元素后,在組件元素內寫的內容
// 就會跑到它這里了

### 具名插槽
<div id="app">
    <child-component>
    // slot 對應 solt標簽的 name值 一一對應實現
        <template slot="girl">
            漂亮、美麗、購物、逛街
        </template>
        <template slot="boy">
            帥氣、才實
        </template>
        <div>
            我是一類人,
            我是默認的插槽
        </div>
    </child-component>
</div>
<script>
    Vue.component('child-component',{
        template:`
            <div>
            <h4>這個世界不僅有男人和女人</h4>
			// name屬性為名字
            <slot name="girl"></slot>

            <div style="height:1px;background-color:red;"></div>

            <slot name="boy"></slot>

            <div style="height:1px;background-color:red;"></div>
			// 一個不帶 name 的 <slot> 出口會帶有隱含的名字“default”。
            <slot></slot>
            </div>
        `
    })
    let vm = new Vue({
        el:'#app',
        data:{

        }
    })
</script>

引入文件兩種方法 es6

 //導出方式 
// export后必須跟語句, 何為語句, 如聲明, for, if 等都是語句, export 不能導出匿名函數, 也不能導出某個已經聲明的變量 可以出現多次
例如
export const bar = function() {};   // 合法
export bar;                         // 非法
export 1;                           // 非法
export function foo () {};          // 合法, 后跟的是聲明語句
export { foo };                     // 合法, 后面跟的{}理解為語句, 就像if后面的{}一樣
export { foo as bar };              // 合法
export { foo: foo };                // 非法, 后面的{}被解析成對象
// ============================================================================================
// 導出方式
// export default 在整個模塊中只能出現一次, 后只能具體的值, 何為具體的值, 如1, 2, 3, 再比如一個函數聲明(非表達式), 或者是一個類聲明(與函數聲明一個意思), 或者匿名函數, 只要是能用變量接受的都可以
例如:
export default 1;                   // 合法
export default function foo() {};   // 合法, 因為function foo() {} 能被變量接受, 如 var bar = function foo() {}
export default const bar = 1;       // 非法, 因為var a = const bar = 1 是不合法的
export default { foo };             // 合法, {} 被理解為一個對象
export default { foo: foo };        // 合法, 同上

v-model后綴

//不設置.number的情況下即使輸入的是數字也會被當成字符串處理
v-model.number // 只能輸入數字 當input 輸入無限大的值 值自動轉換為 Infinity
v-model.trim  // 除去前后空格
v-model.lazy  // 當失去焦點時 數據才會響應改變 

特殊問題

給el-input 綁定點擊事件綁定不上

原理

VUE中直接在標簽中寫@click事件時,等號右邊的函數會默認為是vm對象的一個方法,因此會在js中尋找_vm.alert方法,找不到會報以下錯誤Property or method "alert" is not defined on the instance but referenced during render

解決辦法
// 有時候,你可能想在某個組件的根元素上監聽一個原生事件。可以使用 v-on 的修飾符 .native。例如:

<my-component v-on:click.native="doTheThing"></my-component>
用 .native來修飾

vue路由的history模式

當發現刷新會錯亂時候 要記得把 index.html引入文件放到 vue 文件 中去引入 解決問題 其他情況暫時未遇到

history 模式需要 后端配合設置 后端的 服務器配置 不然會 404

vue 自定義指令

delete請求的數據 axios 傳數據

export const delete_rewar = params => {  // params{id:1 }
  return axios
    .delete(`/rewardRule`, {
      data: params
    })
    .then(res => res);
};

put請求的數據 axios 傳數據

export const alter_the_state = params => { // params{id:1}
  return axios
    .put(
      `/agent`,
      qs.stringify(params)
    )
    .then(res => res);
}; 

get post 清求例子

// GET請求的例子
export const GET = params => { // params{id:1}
  return axios
    .get(`/`, {
      params: params
    })
    .then(res => res);
};
// POST請求的例子
export const POST = params => { // params{id:1}
  return axios.post(`/`, params).then(res => res);
};

表單驗證問題

表單驗證規則

<el-form :model="form" ref="ruleForm" :rules="rules"> 
	<el-form-itme prop="mydata">
    	
    </el-form-item>
</el-form>
created(){
	this.$refs.ruleForm.resetFields(); // 重置表單的方法
}
data(){
    const betweenInt = (rule,value,callback)=>{
        // rule 規則名稱
        // value 每個驗證的值
        // 驗證不通過 返回
        return callback(new Error(`未通過`))
        // 驗證通過 返回
        return callback()
    }
    return {
        form:{ // form :model
            mydata:1, // 可以被驗證 
          
            mydata:{
                a:1 // 被驗證需要 嵌套一層form 只有form和 item是父子關系才能被校驗
            }
        },
          rules{
              mydata:[
                  // 規則
                  { required: true, message: "請輸入規則名稱", trigger: "blur" },
                  // 自定義規則
                  { validator: betweenInt, trigger: "blur" }
              ]
          }
    }
}
// 一般點擊提交觸發
// 注意 嵌套時 因為兩層 form 所以 form ref也有兩個 因此 此時也要嵌套
 ref .validate(async valid => {
			if (valid) {
			//結果通過的
			}elsr{
            	
            }
 		})


// 實用驗證規則
數字范圍內的 正整數
// 驗證是[min, max]范圍內的正整數
const betweenInt = (min, max) => (rule, v, cb) => {
  const isBetween = v >= min && v <= max
  const isInt = /^[0-9]+$/.test(v)
  if (isBetween && isInt) return cb()
 
  return cb(new Error(`要求是在${min}到${max}的正整數 [${min}, ${max}]`))
}

// 清除單個itme的驗證結果
<el-form-item label="有效期" :label-width="formLabelWidth" prop="time"  ref="timeForm"> // ref的方法
    <el-radio v-model="radio1" @change="change" label="0" border>長期有效</el-radio>
	<el-radio v-model="radio1" @change="change" label="1" border>有效期</el-radio>
	<template v-if="radio1 - 0">
        <el-date-picker
        v-model="form.time"
        type="datetimerange"
        start-placeholder="開始日期"
        end-placeholder="結束日期"
        :default-time="['12:00:00']"
        :disabled="dis_time"
        ></el-date-picker>
	</template>
</el-form-item>
this.$refs['timeForm'].clearValidate() //清楚單個的驗證

給el-select寫驗證 需要使用 change事件 但是會自動觸發

解決辦法:

// 新增彈窗頁面的話 可以給定默認值 可以不寫驗證

el-select 獲取整條數據 查詢整條數據的方法

 get_bus_id(val) { // 當前數據的 val
      // 獲取整條數據 遍歷獲取整條數據
      const obj = this.bus_data.find(item=>{
        return item.appId === val
      })
		// obj ===> 整條數據
    }

el-table

element - message

this.$message.closeAll() // 關閉所有彈窗
this.$message({ // 因為會出現很多個 所以要先關閉再打開
    type:warning,
    message:"提示"
})
// 也可以統一處理
暫無

element - loading 全局配置

import { Message, Loading } from 'element-ui'; // 導入 loading 模塊
let loading        //定義loading變量

function startLoading() {    //使用Element loading-start 方法 啟動loading
    loading = Loading.service({
        lock: true,
        text: '加載中……',
        background: 'rgba(0, 0, 0, 0.7)'
    })
}
function endLoading() {    //使用Element loading-close 方法 關閉loading
    loading.close()
}
// 因為同一頁面請求不止一個 所以為了解決每次請求啟動一個loading的bug 所以 解決方案如下

//那么 showFullScreenLoading() tryHideFullScreenLoading() 要干的事兒就是將同一時刻的請求合並。
//聲明一個變量 needLoadingRequestCount,每次調用showFullScreenLoading方法 needLoadingRequestCount + 1。
//調用tryHideFullScreenLoading()方法,needLoadingRequestCount - 1。needLoadingRequestCount為 0 時,結束 loading。
let needLoadingRequestCount = 0
export function showFullScreenLoading() {
    if (needLoadingRequestCount === 0) {
        startLoading()
    }
    needLoadingRequestCount++
}

export function tryHideFullScreenLoading() {
    if (needLoadingRequestCount <= 0) return
    needLoadingRequestCount--
    if (needLoadingRequestCount === 0) {
        endLoading()
    }
}


//http request 攔截器
axios.interceptors.request.use(
    config => {
        var token = ''
        if(typeof Cookies.get('user') === 'undefined'){
            //此時為空
        }else {
            token = JSON.parse(Cookies.get('user')).token
        }//注意使用的時候需要引入cookie方法,推薦js-cookie
        config.data = JSON.stringify(config.data);
        config.headers = {
            'Content-Type':'application/json'
        }
        if(token != ''){
          config.headers.token = token;
        }
        showFullScreenLoading() // 使用定義方法
        return config;
    },
    error => {
        return Promise.reject(err);
    }
);
//http response 攔截器
axios.interceptors.response.use(
    response => {
        //當返回信息為未登錄或者登錄失效的時候重定向為登錄頁面
        if(response.data.code == 'W_100004' || response.data.message == '用戶未登錄或登錄超時,請登錄!'){
            router.push({
                path:"/",
                querry:{redirect:router.currentRoute.fullPath}//從哪個頁面跳轉
            })
        }
        tryHideFullScreenLoading() // 使用定義方法
        return response;
    },
    error => {
        return Promise.reject(error)
    }
)

項目文件 可視化大小

首先 
npm install --save-dev webpack-bundle-analyzer
然后運行 
npm run build --report  // 命令會自動打包,並彈出網頁(包含打包文件圖)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM