布局相关题
介绍一下 flex 布局,flex:1是哪几个属性的缩写
Flex布局是CSS中的弹性盒子布局,旨在为布局提供更加灵活的方式,可以实现对盒子的自适应调整和对齐方式的灵活控制。以下是Flex布局中常用的几个属性:
- display:设置应用Flex布局方式的容器元素。容器元素的display属性为flex或inline-flex时容器内的子元素即应用了Flex布局方式。
- flex-direction:设置Flex容器内的Flex子元素的排列方向。Flex容器内的子元素可以横向排列(row)或纵向排列(column)。
- justify-content:设置Flex容器内的Flex子元素在Flex容器中沿主轴方向上的对齐方式。支持值有:flex-start、flex-end、center、space-between、space-around、space-evenly。
- align-items:设置Flex容器内的Flex子元素在Flex容器中沿交叉轴方向上的对齐方式。支持值有:flex-start、flex-end、center、baseline、stretch。
- align-content:设置Flex容器内的各个Flex子元素在交叉轴方向上的排列方式。支持值有:flex-start、flex-end、center、space-between、space-around、stretch。
其中,flex:1是flex-grow、flex-shrink、flex-basis三个属性的缩写。具体来说,它的意思是:
flex-grow: 1; flex-shrink: 1; flex-basis: 0%;
flex-grow
属性表示子元素的放大比例,可以设置为一个非负数。若容器空余空间大于0,子项目的大小会按照这个比例进行调整。flex-shrink
属性表示子元素的缩小比例,可以设置为一个非负数。当容器空间不足指定时,子项目会按照这个比例进行缩小。flex-basis
属性表示项目在分配多余空间之前的初始值。可以指定为一个长度(比如50px)或百分比(比如20%)。
当只设置flex:1;
时,表示子元素会根据父元素的大小自适应调整,并平分剩余空间。即将所有子元素的flex-basis
设定为0,并将所有子元素的flex-grow
设定为相等的值1。这通常用于使所有子元素自适应父元素的空间,并占据整个父元素的空间。
grid 布局是什么?,和flex 布局有什么区别,他们的应用场景你会怎么选?
Grid布局是CSS中的一种强大的二维布局系统,可以用于开发复杂的网格布局。相较于Flex布局,Grid布局更加灵活、强大,可以实现更加复杂的布局效果。
Grid布局与Flex布局主要的区别如下:
- 方向不同:Flex布局只有主轴和交叉轴两个方向,而Grid布局则基于行和列构建。
- 维度不同:Flex布局是一维布局,使用于单行或单列的情况。而Grid布局是二维布局,可以同时控制行和列。
- 对齐方式不同:Flex布局的主要目的是控制项目在主轴和交叉轴上的对齐方式。而Grid布局可以针对任意行或列,控制对齐方式。
他们的应用场景一般如下:
- 对于单行或单列等简单布局,使用Flex布局就足够了,因为它代码简单、易于理解。
- 对于需要控制多个项目多个维度的情况,Grid布局比Flex布局更加灵活、强大。例如,依次过滤五万个商品中,只显示特定颜色和分类的商品,并保证商品字体大小一致时,就可以利用Grid布局解决。
因此,在选择应该使用Flex布局还是Grid布局时,需要结合布局的实际情况做出选择。如果需要控制多行、多列,更加复杂的嵌套结构和空间关系时,应当使用Grid布局。如果只是简单的单行或单列布局时,使用Flex布局则更为方便。
flex 布局还有什么常用的属性? justify-content 有哪些可选项? 如果让他们都靠左对齐如何实现
除了justify-content
属性以外,flex布局还有许多其他常用的属性,以下是一些常用的属性:
flex-direction
:定义主轴的方向,可选值有row(默认值,从左到右)、row-reverse(从右到左)、column(从上往下)和column-reverse(从下往上)。flex-wrap
:定义如何换行,可选值有nowrap(不换行)、wrap(换行,第一行在上方)和wrap-reverse(换行,第一行在下方)。flex-flow
:同时定义flex-direction
和flex-wrap
属性的缩写。align-items
:定义交叉轴上的对齐方式,可选值有flex-start(默认值,交叉轴的起点对齐)、flex-end(交叉轴的终点对齐)、center(交叉轴的中点对齐)、baseline(基线对齐)和stretch(如果子项目没有设置高度,则拉伸子项目以与容器相同的高度)。align-content
:定义多根轴线的对齐方式,可选值与align-items
相同,但只对多行flex容器生效。
就justify-content
属性而言,以下是可选的属性值:
flex-start
:默认值,左对齐。flex-end
:右对齐。center
:居中对齐。space-between
:两端对齐,项目之间的间隔相等。space-around
:每个项目两侧的间隔相等。
如果要让flex容器左对齐,可以将justify-content
属性设置为flex-start
即可,示例如下:
.flex-container { display: flex; justify-content: flex-start; }
上述代码中,.flex-container
为flex容器的类名,justify-content: flex-start;
表示让flex容器左对齐。
盒子垂直水平居中,有几种方法
在前端开发中,将盒子垂直和水平居中是一个非常常见的需求,下面列出几种实现方法:
1. 使用flex布局
可以使用flex布局中的justify-content和align-items属性。将display属性设置为flex,然后将justify-content和align-items都设置为center,即可实现盒子的水平和垂直居中。
.container { display: flex; justify-content: center; align-items: center; }
2. 使用绝对定位
将盒子的position属性设置为absolute,并将left、right、top、bottom都设置为0,然后将margin属性设置为auto,即可实现盒子的水平和垂直居中。
.container { position: relative; } .box { position: absolute; top: 0; left: 0; bottom: 0; right: 0; margin: auto; }
3. 使用display和margin
将盒子的display属性设置为inline-block,并将盒子的宽度和高度都设置为确定的值,然后将margin属性的值设置为auto,即可实现盒子的水平和垂直居中。
.container { text-align: center; } .box { display: inline-block; width: 200px; height: 200px; margin: auto; }
根据需求不同,也可以结合上述方法,进行组合使用,来达到更加复杂的布局方式。
Vue相关题
对 VUE3 的了解
Vue3是Vue.js项目的下一代版本,相比于Vue2,Vue3在性能、开发体验和功能方面都有了重要的改进和变化。Vue3于2020年9月正式发布,以下是对Vue3的简要介绍:
- 更快的渲染速度:Vue3中重新设计了虚拟DOM算法,优化了渲染性能。在实际测试中,Vue3的性能比Vue2有了明显的提升。
- 更小的体积:Vue3中优化了打包结构,将Vue核心库和编译器分开打包,使得运行时库、编译器和模板编译器的体积都更小。
- 更好的TypeScript支持:Vue3中对
TypeScript
的支持更加完善,可以更便捷地使用TypeScript
开发Vue项目。 - 改进的响应式系统:Vue3中重新设计了响应式系统,使用
Proxy
代替了Object.defineProperty
实现,使得响应式数据更加稳定、性能更高。 Composition API
:Vue3中提供了Composition API
,可以将一个组件拆分成逻辑相关的部分,并使每个部分独立可测试、可重用。这个特性可以优化代码结构,使得代码更加易于维护。Teleport
:Vue3中提供了Teleport
特性,可以将组件的DOM插入到任何指定的DOM节点,使得多个组件共用同一个Template变得更加便捷。- 其他功能:Vue3中还加入了
Suspense
(异步组件Loading)和Fragments
等新的功能。
总之,Vue3是一个更加高效、易用、灵活的版本,它带来了更好的性能、更好的组织代码的方式、更好的TypeScript支持和更加丰富的功能。同时,Vue3也保留了Vue2的一些核心特性,原有的Vue项目可以平滑地升级到Vue3。
setup 是什么
在Vue3中,setup
是一个新的组件选项,代替了Vue2中的beforeCreate
和created
钩子函数。它是一个特殊的函数,用于设置组件的响应式数据、计算属性、事件处理函数等。
setup函数会在组件实例创建之前执行,它接收两个参数:props
和context
。
- props是一个对象,包含了组件的
props
数据; - context 是一个对象,包含了与当前组件上下文相关的属性和方法,例如
attrs、slots和emit
等。
在setup中可以使用Vue3中新增的响应式API(例如ref和reactive)来创建响应式数据,并通过return语句将数据暴露给组件模板使用。
以下是一个简单的例子:
<template> <div> <p>Count: {{ count }}</p> <button @click="increaseCount">Increase</button> </div> </template> <script> import { ref } from 'vue'; export default { setup(props, context) { const count = ref(0); const increaseCount = () => { count.value++; } return { count, increaseCount } } } </script>
在上面的例子中,setup函数使用ref创建了一个响应式数据count,并定义了一个事件处理函数increaseCount。最后,通过return语句将count和increaseCount暴露给组件模板使用。
需要注意的是,由于setup是一个新的选项,会替代beforeCreate和created钩子函数,因此在使用setup时,应该避免在beforeCreate和created钩子函数中定义数据,并确保所有的数据定义都在setup函数中进行。此外,setup中不能使用this关键字,因为this在setup中并不指向组件实例。
想操纵一个 DOM 元素,我应该在哪个生命周期里面去操作
- 如果您想在Vue组件中操作DOM元素,则应该在
mounted
生命周期中执行操作。这是因为在mounted
生命周期期间,组件已经插入到页面中,所以可以安全地操作DOM元素。 - 当数据发生变化时,Vue会触发组件的更新,此时会依次触发
beforeUpdate
和updated
生命周期函数。在beforeUpdate生命周期中,您可以访问先前的DOM状态并执行必要的操作。而在updated生命周期中,您可以访问更新后的DOM状态,但是请注意,在此期间更新DOM可能导致无限循环更新,因此应该谨慎操作。 - 请注意,任何情况下都不建议直接操作DOM元素,Vue的理念是数据驱动视图,在大多数情况下,只需要更新数据即可使DOM自动更新。如果您确实需要直接操作DOM元素,建议使用Vue提供的ref来获取DOM元素的引用,并在mounted生命周期中执行操作。
Updated 可以更新 DOM 节点吗,或者说更新数据吗
updated
生命周期函数用于在组件的DOM
更新后执行操作,它不是用于直接操作DOM
元素的函数。在updated
生命周期函数中,您可以访问更新后的数据和DOM
节点,但是建议您不要直接操作DOM
节点,而是通过Vue
的数据驱动视图的特性更新数据,从而更新DOM
。- 更具体地说,当
Vue
组件的数据发生变化时,Vue会重新渲染组件的DOM
节点。如果您在updated
生命周期函数中直接修改DOM节点,则会导致Vue检测到DOM节点发生了变化,因此会再次更新DOM节点,从而导致无限循环更新。 - 因此,建议您在
updated
生命周期函数中只处理一些需要在DOM更新后重新计算的操作,而不直接操作DOM
节点。如果您需要更新DOM
节点,请在mounted
生命周期函数中执行操作。
VUE 中有父子组件嵌套,当我子组件加载完成以后,那父组件是什么状态
在Vue中,父子组件嵌套时子组件的加载完成并不影响父组件的状态。当子组件完成加载后,Vue会将子组件的内容插入到父组件中,并执行父组件的生命周期钩子函数。
具体来说,当子组件加载完成后,父组件的mounted钩子函数会被调用。
在mounted钩子函数中,可以访问子组件的DOM节点和数据。
需要注意的是,如果子组件中的数据是异步加载的,那么在父组件的mounted钩子函数中访问子组件的数据可能还没有加载完成。此时可以使用Vue提供的异步组件和webpack的动态import()语法来实现异步加载子组件和数据。
另外,如果是同时加载多个子组件,那么父组件的mounted
钩子函数会在所有子组件完成加载后执行一次。如果需要在所有子组件加载完成后执行某些操作,可以在异步加载模块的回调函数中处理。
父子组件加载顺序应该是什么样的
在Vue中,父子组件的加载顺序是有规定的,具体如下:
- 首先加载父组件,父组件的创建过程是在
beforeCreate
和created
钩子函数之间进行的。 - 然后加载子组件,子组件的创建过程也是在
beforeCreate
和created
钩子函数之间进行的。 - 当子组件被创建完成之后,Vue会将子组件挂载到父组件上,这个过程在父组件的
mounted
钩子函数中进行。
值得注意的是,如果父组件中使用了v-if,当v-if表达式的值为false时,子组件不会被创建。而如果使用了v-show,子组件会被创建,但是不会立即被渲染到页面上。
另外,如果父组件和子组件中都有钩子函数,那么他们的执行顺序是先父组件再子组件。
简而言之,在Vue中,父组件和子组件的创建顺序是按照从父组件到子组件的顺序来进行的,而挂载的顺序则是从子组件到父组件的顺序来进行的。
父子组件之间如何进行通信?
在Vue中,父子组件之间可以通过Props
和事件(Event
)来进行通信。
1. Props
Props是用来传递数据给子组件的机制,父组件可以在引入子组件时通过Props进行传递。在子组件内部,可以通过this.$props来访问并使用Props。
举个例子,假设有一个父组件和一个子组件,父组件中有一个数据变量message,我们希望将这个变量传递给子组件。
<!-- 父组件 --> <template> <div> <child-component :message="message"></child-component> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { data() { return { message: 'Hello World' } }, components: { ChildComponent } } </script> <!-- 子组件 --> <template> <div> <p>{{message}}</p> </div> </template> <script> export default { props: { message: String } } </script>
在上面的例子中,父组件通过属性绑定将message变量作为message props传递给了子组件,子组件通过props选项声明了message props的类型。在子组件中就可以使用props.message访问并使用父组件中的变量了。
2. 事件(Event)
如果需要从子组件向父组件传递数据,则可以使用事件(Event)机制,在子组件中触发一个事件,由父组件监听并处理该事件。
假设父组件和子组件之间需要进行一个简单的计数器操作。
<!-- 父组件 --> <template> <div> <child-component @click="increaseCount"></child-component> <p>Count: {{count}}</p> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { data() { return { count: 0 } }, components: { ChildComponent }, methods: { increaseCount() { this.count++; } } } </script> <!-- 子组件 --> <template> <div> <button @click="$emit('click')">Increase Count</button> </div> </template>
在上面的例子中,子组件中的按钮通过监听click事件来触发父组件中的increaseCount方法。在触发事件时,使用了$emit方法来发送一个自定义的click事件。
通过上面的两个例子,我们可以看到Props和事件机制的使用非常简单和灵活,可以满足父子组件之间的大部分通信需求。
Vue3 中如何对传过来的数据类型进行限制,应该用哪个API?
在Vue3中,可以使用Props来限制传递给组件的属性类型。Props是组件的属性,用于接收外部传递的数据。
使用Props定义组件的属性时,可以指定数据类型、默认值、是否必须等选项。如果传递的数据类型不符合规定的类型,则会在浏览器控制台中显示警告信息。
下面是一个示例,展示如何在Vue3中使用Props限制数据类型:
<template> <div> <h1>{{title}}</h1> <p>{{text}}</p> </div> </template> <script> export default { props: { title: { type: String, required: true }, text: { type: String, default: 'Hello World' } } } </script>
在上面的示例中,定义了两个Props属性,分别是title和text。title属性必须为字符串类型,并且必须传递,否则会有警告信息;而text属性可以为字符串类型或为空,如果未传递,则使用默认值。
值得注意的是,即使使用Props限制了数据类型,也需要在组件内部对传递的数据进行正确性验证和处理,以确保应用程序的稳定性和安全性。
AI为面试赋能:利用AI去回答网友的面试题(二)https://developer.aliyun.com/article/1426124