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  // 命令会自动打包,并弹出网页(包含打包文件图)

猜你喜欢

转载自www.cnblogs.com/whoani/p/11597819.html