Vue项目开发中遇到的一些点,记录一下

目录

1. @U/ 代指什么

2、组件传值provider/inject

3.display: -webkit-box;

4.内边距

5.overflow

可能的值

6.transition过渡

语法

7.json.stringify()

8.input autocomplete

9.loading加载中

10.路由中的meta

11.vue监听数据

12.65535

13.父组件调用子组件方法

14.子组件监听父组件的变量

15.flex布局

16.具名插槽 slot-scope

17.this.$options.data()

18.vue事件的派发与接收(触发和监听)

19. 子组件不要直接更改父组件传过来的值

20. new Date()添加 prototype 方法

21.mvc 和 mvvm

22.DIV+ CSS 布局

23. vue 子路由

24. iview

​25. 箭头函数 和 that


1. @U/ 代指什么

默认到那个文件下面找 @U代指 src 下的 util文件夹,@U/ajax代指src下的util下的ajax.js文件

2、组件传值provider/inject

provider/inject:简单来说就是在父组件 provide 中提供变量,子组件 inject 中来注入,然后可以在子组件内部使用 provide 的变量.

需要注意的是这里不论子组件有多深,只要调用了inject那么就可以注入provider中的数据。而不是局限于只能从当前父组件的prop属性来获取数据。

App.vue

<template>
  <div id="app">
    <div>
      <second/>
    </div>
  </div>
</template>
 
<script>
import second from './components/Second'
  export default {
    name: 'app',
    components: {
      second
    },
    provide: {
      test: 'App 根组件的 provide'
    },
    data() {
      return {
      }
    },
    methods: {
    }
  }
</script>
 
<style>
</style>

Second.vue

<template>
    <div>
      <p>second: {{ test }}</p>
      <third/>
    </div>
</template>
 
<script>
import third from './Third.vue';
  export default {
    name: 'second',
    components: {
        third
    },
    inject: ['test'],
    data() {
      return {
         
      }
    },
    methods: {
     
    }
  }
</script>
 
<style>
</style>

Third.vue

<template>
    <div>
      <p>third: {{ test }}</p>
    </div>
</template>
 
<script>
  export default {
    name: 'third',
    components: {},
    inject: ['test'],
    data() {
      return {
         
      }
    },
    methods: {
     
    }
  }
</script> 
<style>
</style>

3.display: -webkit-box;

流式布局:通常用%来设置,如下例子,流式布局

<!DOCTYPE html>
<html>
    <head>
        <title>Liquid Layout</title>
        <style type="text/css">
            * {
                color: #fff;
                text-align: center;
                                }
            body {
                width: 90%;
                margin: 0 auto;
                                }
           #content {
                overflow: auto;
                                }
            #nav, #feature, #footer {
                margin: 1%;
                                }
            .column1, .column2, .column3 {
                width: 31.3%;
                float: left;
                margin: 1%;
                                /* border: 0.0625rem solid; */
                                }
            .column3 {
                margin-right: 0%;
                                }
            li {
                display: inline;
                padding: 0.5em;
                                }
            #nav, #footer {
                
                padding: 0.5em 0;
                                }
            #feature, .article {
                color:#fff;
                height: 10em;
                margin-bottom: 1em;
                }
        </style>
    </head>
    <body>
        <h1 style="color:#706fd3">软件开发</h1>
        <div id="header" style="background-color: #5555ff;">
            <h1>Logo</h1>
            <div id="nav">
                <ul>
                    <li><a href="">首页</a></li>
                    <li><a href="">产品</a></li>
                    <li><a href="">服务</a></li>
                    <li><a href="">关于我们</a></li>
                    <li><a href="">联系我们</a></li>
                </ul>
            </div>
        </div>
        <div id="content" style="background-color: #366092;">
            <div id="feature">
                <p>功能</p>
            </div>
            <div class="article column1">
                <p>第一列</p>
            </div>
            <div class="article column2">
                <p>第二列</p>
            </div>
            <div class="article column3">
                <p>第三列</p>
            </div>
        </div>
        <div id="footer" style="background-color: #333333;s">
            <p>&copy; Copyright 2019</p>
        </div>
    </body>
</html>

流体布局设计随着用户对浏览器窗口的扩大或缩小而伸展或收缩。这种设计通常使用百分数。

优势

  • 页面会伸展到整个浏览器窗口,所以即使在大屏幕上,页面的周围 也没有空白;

  • 如果用户的窗口很小,页面就会收缩以适应窗口,而不必横向滚动;

  • 即使用户设置的字体比设计人预设的更大,这种设计也可以适应(因为页面可以伸展)。

劣势

  • 如果不对页面各个部分的宽度加以控制,那么页面设计会和预期的效果大相径庭,例如某些项目或元素挤压到一起,其周围出现意想不到的空隙;

  • 如果用户的窗口非常宽,文本行就会很长,以至于难以阅读;

  • 如果用户的窗口非常窄,单词可能会被挤压,导致每行只有几个单词;

  • 如果一个固定宽度的元素位于一个不能容纳它的盒子里,那么这个元素就会溢出盒子。

由于流体布局可以伸展到浏览器窗口的整个宽度,产生难以阅读的长文本行,所以有些流媒体布局只让页面的一部分伸展和收缩。

在页面的其它部分则限制最大和最小宽度。

不同的浏览器有不同的前缀,这里使用-webkit示例

Mozilla-----------------display:-moz-box

Webkit------------------display:-webkit-box

As specified-----------display:box

提供的关于盒模型的几个属性

box-orient子元素排列 vertical(竖排)orhorizontal(横排)
box-flex兄弟元素之间比例,仅作一个系数
box-alignbox排列
box-directionBox方向
box-flex-group以组为单位的流体系数
box-lines
box-ordinal-group以组为单位的子元素排列方向

首先,需要了解的是具备的属性

-webkit- box-flex在子元素上设置,属于子元素之间的比例,值为数值即可默认值:1(数值,按比例分配)
-webkit-box-orient在父元素设置,子元素的排列方式vertical(垂直)/horizontal(水平)/inline-axis(默认值,横向排列,映射为 horizontal)/block-axis(沿着块轴来排列子元素,映射为 vertical)/inherit(从父元素继承 box-orient 属性的值)
-webkit-box-align在父元素设置,子元素垂直方向的对齐方式start(对于正常方向的框,每个子元素的上边缘沿着框的顶边放置。对于反方向的框,每个子元素的下边缘沿着框的底边放置。)/end(对于正常方向的框,每个子元素的下边缘沿着框的底边放置。对于反方向的框,每个子元素的上边缘沿着框的顶边放置。)/center(均等地分割多余的空间,一半位于子元素之上,另一半位于子元素之下)/baseline(如果 box-orient 是inline-axis或horizontal,所有子元素均与其基线对齐)/stretch(默认值,拉伸子元素以填充包含块)
-webkit-box-direction在父元素上设置,排列顺序normal(默认,以默认方向显示子元素)/reverse(以反方向显示子元素。)/inherit(从子元素继承 box-direction 属性的值)
-webkit-box-flex-group在子元素上设置,以组为单位的流体系数默认值:1
-webkit-box-ordinal-group在子元素上设置,以组为单位的排列方向默认值:1
-webkit-box-pack在父元素上设置,子元素水平方向的对齐方式center(均等地分割多余空间,其中一半空间被置于首个子元素前,另一半被置于最后一个子元素后)/justify(在每个子元素之间分割多余的空间(首个子元素前和最后一个子元素后没有多余的空间))/start[对于正常方向的框,首个子元素的左边缘被放在左侧(最后的子元素后是所有剩余的空间)对于相反方向的框,最后子元素的右边缘被放在右侧(首个子元素前是所有剩余的空间)]/end[对于正常方向的框,最后子元素的右边缘被放在右侧(首个子元素前是所有剩余的空间)。对于相反方向的框,首个子元素的左边缘被放在左侧(最后子元素后是所有剩余的空间)。]
-webkit-box-lines子元素是否换行,类似word-wrap和word-breaksingle(将被放置在单个行或列的所有子元素(元素不适合只会被认为是溢出))/multiple(box允许扩大到多行,以适应其所有子项)

4.内边距

5.overflow

overflow 属性规定当内容溢出元素框时发生的事情。

这个属性定义溢出元素内容区的内容会

如何处理。如果值为 scroll,不论是否需要,用户代理都会提供一种滚动机制。因此,有可能即使元素框中可以放下所有内容也会出现滚动条。

所有主流浏览器都支持 overflow 属性。

可能的值

描述
visible默认值。内容不会被修剪,会呈现在元素框之外。
hidden内容会被修剪,并且其余内容是不可见的。
scroll内容会被修剪,但是浏览器会显示滚动条以便查看其余的内容。
auto如果内容被修剪,则浏览器会显示滚动条以便查看其余的内容。
inherit规定应该从父元素继承 overflow 属性的值。

6.transition过渡

注释:请始终设置 transition-duration 属性,否则时长为 0,就不会产生过渡效果。

默认值:all 0 ease 0
继承性:no
版本:CSS3
JavaScript 语法:object.style.transition="width 2s"

语法

transition: property duration timing-function delay;
描述
transition-property规定设置过渡效果的 CSS 属性的名称。
transition-duration规定完成过渡效果需要多少秒或毫秒。
transition-timing-function规定速度效果的速度曲线。
transition-delay定义过渡效果何时开始
<!DOCTYPE html>
<html>
<head>
<style> 
div
{
width:100px;
height:100px;
background:blue;
transition:width 2s;
-moz-transition:width 2s; /* Firefox 4 */
-webkit-transition:width 2s; /* Safari and Chrome */
-o-transition:width 2s; /* Opera */
}
​
div:hover
{
width:300px;
}
</style>
</head>
<body>
​
<div></div>
​
<p>请把鼠标指针移动到蓝色的 div 元素上,就可以看到过渡效果。</p>
​
<p><b>注释:</b>本例在 Internet Explorer 中无效。</p>
​
</body>
</html>
​

7.json.stringify()

JSON 的常规用途是同 web 服务器进行数据交换。

在向 web 服务器发送数据时,数据必须是字符串。

通过 JSON.stringify() 把 JavaScript 对象转换为字符串

8.input autocomplete

当我们在浏览器中输入表单信息的时候,往往input文本输入框会记录下之前提交表单的信息,以后每次只要双击 input文本输入框就会出现之前输入的文本,这样有时会觉得比较方便,但有时也会暴露用户的隐藏数据,那么如何让input表单输入框不记录输入过信息的方法呢? 方法一: 在不想使用缓存的input中添加 autocomplete="off" 例如 名字:<input type="text" name="FirstName" value="" autocomplete="off" /> 姓氏:<input type="text" name="LastName" value="" autocomplete="on" /> 方法二: 如果整个表单元素都不使用autocomplete功能的话,在 input 所在的form标签中添加 autocomplete="off" 例如

<form action="#" autocomplete="off">
<input type="text" name="test" />
</form>

9.loading加载中

10.路由中的meta

直接在路由配置的时候,给每个路由添加一个自定义的meta对象,在meta对象中可以设置一些状态,来进行一些操作。用它来做登录校验再合适不过了

11.vue监听数据

这样写就可以监听得到了

12.65535

65535是计算机16位二进制最大数

65535一般是内存地址最大值

13.父组件调用子组件方法

<!-- 次要观看条件 -->
<el-form-item>
    <secondViewCondition @secondViewRadioChange="secondViewRadioChange" ref="secondVC" :radio="form.radio"></secondViewCondition>
</el-form-item>

使用 ref 设置子组件

然后使用 this.$refs.ref属性名.子组件方法名()

// getChangeCondition() 这是子组件内部的方法
let rankSecondary = this.$refs.secondVC.getChangeCondition()

14.子组件监听父组件的变量

子组件:

// 获取父组件传过来的值,设置类型 + 默认值
props: {
    radio: {
      type: String,
      default: ''
    }
  },

监听:

// 监听radio的值, 这里面的this指的是vue实例
watch: {
    radio: function(newValue, oldValue) {
      console.log("监听"+newValue+" "+oldValue)
      if(newValue == this.form.radio || newValue == 'none'){
        this.form.radio = ''
      }
    }
  },

监听里面的 方法 谨慎使用 箭头函数,即:

radio: (newValue,oldValue) => {
	console.log(this)
}

1.箭头函数没有自己的this, 它的this是继承而来; 默认指向在定义它时所处的对象(宿主对象),而不是执行时的对象, 定义它的时候,可能环境是window; 箭头函数可以方便地让我们在 setTimeout ,setInterval中方便的使用this

2.箭头函数中,this指向的固定化,并不是因为箭头函数内部有绑定this的机制,实际原因是箭头函数根本没有自己的this,导致内部的this就是外层代码块的this。

15.flex布局

目前所有浏览器都兼容。

注意,设为 Flex 布局以后,子元素的floatclearvertical-align属性将失效。

//display 设置项目为flex布局
#app {
    display: flex;
}
//flex 设置项目的排序方向  row水平正向,row-reverse水平反向,column垂直正向,column-reverse垂直反向

{
	flex-direction: row| row-reverse|column|column-reverse;
}
//flex-wrap 设置项目换行  wrap换行,第一行在上方; wrap-reverse:换行,第一行在下方; nowrap默认不换行
{
    flex-wrap: wrap|wrap-reverse|nowrap; 
}
//justify-content 设置项目主轴(水平)上的对齐方式 flex-start水平左边对齐;flex-end水平右边对齐;center居中对齐;space-between:水平两端对齐;space-around:水平四周对齐
{
    justify-content: flex-start|flex-end|center|space-between|space-around;
}
//align-items 设置项目交叉轴(垂直)上的对齐方式 flex-start垂直顶端对齐;flex-end垂直底部对齐;center垂直居中对齐;baseline项目的第一行文字基线对齐;stretch(默认)如果项目未设置高度或设为auto,将占满整个容器的高度。
{
    align-items: flex-start|flex-end|center|baseline|stretch;
}
// align-content 设置多根轴线的对齐方式 
{
    align-content:flex-start|flex-end|center|space-between|space-around|stretch; 
}
// flex-flow 是flex-direction和flex-wrap属性的简写
{
    flex-flow: row nowrap; // 主轴左边对齐,不换行
}

项目的属性

// order 定义项目的排序。数值越小,排序越靠前,默认为0
.item {
    order: 1;
}
// flex-grow 放大比例 , 默认为0,即如果存在剩余空间,也不放大,所有项目都设为1,则平分剩余空间。
.item {
    flex-grow: <number>;/*default 0*/
}
// flex-shrink 缩小比例,默认是1,即如果空间不足,项目将等比例缩小。如果为0,则不缩小。
.item {
 	flex-shrink:<number>;
}
// flex-basis 分配空余空间时,项目占据的主轴空间。默认值为auto,即项目的本来大小。
.item {
    flex-basis: <length>|auto;
}
// flex 是flex-grow,flex-shrink,flex-basis的简写

// none(0 0 auto); 不放大,不缩小,项目占据的主轴空间就是项目大小
.item {
    flex: none|[1 1 auto];
}
//align-self  可以覆盖align-items属性。默认值是0,表示继承父元素的 align-items属性,如果没有父元素,就等同于stretch
.item {
    align-self: auto | flex-start|flex-end|center|baseline|stretch;
}

一个div把它放到最中间

<div class="box"></div>

// 父元素 display: flex
.box {
	justify-content: center;
    aglin-items: center;
}

16.具名插槽 slot-scope

17.this.$options.data()

$options是vue 里面的属性

在data里面定义一个form对象,绑定页面表单。

data:{
    form: {
        id: '',
        name: ''
    }
}
..............................................
// methods里面使用
this.form = this.$options.data().form;
// 这行代码的意思是: 初始化表单里面的数据,使用vue实例里面的optoins属性拿到 data 从而拿到data里面的form

//相当于 this.form.id = ''; this.form.name = '';

new Vue的时候传了一个对象,把该对象记为options,Vue将options中自定义的属性和Vue构造函数中定义的属性合并为vm.$options,vm.$options.data()中的this指向vm.$options.

data()中若使用了this来访问props或methods,在重置$data时,注意this.$options.data()的this指向,最好使用this.$options.data.call(this).

18.vue事件的派发与接收(触发和监听)

var eventHandle = new Vue();

var vue = new Vue({
  el: '#app',
  router,
  vuet,
  template: '<Index/>',
  components: {
    Index
  },
  data: {
    /* 	用于创建页签事件派发
    	派发事件:this.$root.eventHandle.$emit('事件名','传递的参数')
  		事件接收:
  		created:function(){
			var self = this;
  			this.$root.eventHandle.$on('事件名',function(d){

  			})
		}
	  */
    eventHandle: eventHandle
  },
  methods: {}
});

new一个vue对象,加载到eventHandle上,注册到vue实例上去,这个vue对象会跟整个项目的vue一样有相同的生命周期,这样子就可以使用这个对象去触发vue里面的事件了。

// 事件触发(事件派发)
this.$root.eventHandle.$emit("VIDEO_UPLOAD_LIST_DIALOG")
// 事件监听(事件接收)
 this.$root.eventHandle.$on('VIDEO_UPLOAD_LIST_DIALOG', () => {
      this.showUploadList()
    })

19. 子组件不要直接更改父组件传过来的值

20. new Date()添加 prototype 方法

给原生的 Date 添加一个 格式 的方法

/** 时间格式
 *
 * @param {*} fmt 格式字符串 yyyy-MM-dd hh:mm:ss
 * @returns 时间字符串
 */
 Date.prototype.format = function (fmt = "yyyy-MM-dd hh:mm:ss") {
  const o = {
    "M+": this.getMonth() + 1, //月份
    "d+": this.getDate(), //日
    "h+": this.getHours(), //小时
    "m+": this.getMinutes(), //分
    "s+": this.getSeconds(), //秒
    "q+": Math.floor((this.getMonth() + 3) / 3), //季度
    S: this.getMilliseconds(), //毫秒
  };
  if (/(y+)/.test(fmt)) {
    fmt = fmt.replace(RegExp.$1, String(this.getFullYear()).substr(4 - RegExp.$1.length));
  }
  for (const k in o) {
    if (new RegExp(`(${k})`).test(fmt)) {
      fmt = fmt.replace(
        RegExp.$1,
        RegExp.$1.length === 1 ? o[k] : `00${o[k]}`.substr(String(o[k]).length)
      );
    }
  }
  return fmt;
};

21.mvc 和 mvvm


v - view 视图

m - model - 模板

mvc前端是无法保存 数据的,所有的数据都要通过接口调用存到后台

mvvm 加了 viewModel,vM 有 data可以临时存放一些数据,作为前端视图的控制器;

mvvm是前后端分离的根本原因。

vue历史

1.x版本: 没有虚拟DOM,每个元素对应一个 watch,数据change更新DOM

2.x版本:有虚拟dom,

1. 数据驱动

2. 

22.DIV+ CSS 布局


DIV+CSS 是WEB设计标准,它是一种网页的布局方法

1. 内容和表现分离,css样式可以通过文件导入,代码精简了,适合 搜索引擎seo爬取

2. 提高页面浏览速度

3. 易于维护和改版

23. vue 子路由

  以“/”开头的嵌套路径会被当作根路径,所以子路由上不用加“/”;在生成路由时,主路由上的path会被自动添加到子路由之前,所以子路由上的path不用在重新声明主路由上的path了。

24. iview


25. 箭头函数 和 that

 

 箭头函数里面 不能用that了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值