自己怎么做网站的聚合页面/网站营销推广有哪些
一 .v-if和v-show的区别
v-if
和 v-show
是 Vue.js 中两个常用的条件渲染指令,它们都可以根据条件决定是否渲染某个元素。但是它们之间存在一些区别。
- 语法:
v-if
和v-show
的语法相同,都接收一个布尔值作为参数。
<div v-if="show">Hello, World!</div>
<div v-show="show">Hello, World!</div>
- 条件渲染:
v-if
会根据条件决定是否渲染整个元素,如果条件为false
,则元素不会被渲染;v-show
会根据条件决定是否显示元素,如果条件为false
,则元素会隐藏,但仍然存在于 DOM 中。
<div v-if="show">Hello, World!</div>
<div v-show="show">Hello, World!</div>
- 性能:
v-if
会根据条件决定是否渲染整个元素,如果条件为false
,则元素不会被渲染,这种情况下,Vue.js 会销毁和重建元素,性能较差;v-show
会根据条件决定是否显示元素,如果条件为false
,则元素会隐藏,但仍然存在于 DOM 中,这种情况下,Vue.js 不会销毁和重建元素,性能较好。
总结:v-if
和 v-show
都可以根据条件决定是否渲染某个元素,但它们之间存在一些区别。v-if
会根据条件决定是否渲染整个元素,如果条件为 false
,则元素不会被渲染,这种情况下,Vue.js 会销毁和重建元素,性能较差;v-show
会根据条件决定是否显示元素,如果条件为 false
,则元素会隐藏,但仍然存在于 DOM 中,这种情况下,Vue.js 不会销毁和重建元素,性能较好。在实际使用中,可以根据具体需求选择合适的指令。
二.如何理解mvvm
MVVM(Model-View-ViewModel)是一种前端开发模式,它将数据与视图分离,从而提高代码的可维护性和可扩展性。
在 MVVM 模式中,Model 表示数据模型,View 表示视图,ViewModel 表示视图模型。数据模型负责存储数据,视图负责展示数据,视图模型负责将数据与视图进行绑定。
在 MVVM 模式中,视图模型负责将数据与视图进行绑定。当数据模型中的数据发生变化时,视图模型会自动更新视图,从而实现数据与视图的双向绑定。
以下是一个简单的 MVVM 示例:
<template><div><input v-model="searchText" placeholder="Search" /><p>Search text: {{ searchText }}</p></div>
</template><script>
export default {data() {return {searchText: ''};}
};
</script>
在这个示例中,searchText
是数据模型,<input>
和 <p>
是视图,v-model
是视图模型。当用户在输入框中输入内容时,searchText
会自动更新,视图中的内容也会自动更新。
总结:MVVM 是一种前端开发模式,它将数据与视图分离,从而提高代码的可维护性和可扩展性。在 MVVM 模式中,视图模型负责将数据与视图进行绑定,实现数据与视图的双向绑定。
model-view-viewmodel的缩写,是一种设计思想。
model就是数据模型,用于定义数据修改和操作。
view是视图。
viewmodel是连接view和model的桥梁。
当数据改变时,viewmodel通过监听到数据变化,自动更新视图,当用户操作视图时,viewmodel可以监听视图变化,通知数据进行改动。
viewmodel通过双向绑定把view和model连接起来,他们之间的同步是自动的。
三.组件生命周期
Vue 组件的生命周期指的是组件从创建到销毁的一系列过程,可以分为创建、挂载、更新、销毁四个阶段。
-
创建阶段:在创建阶段,Vue 会进行一些初始化工作,如初始化数据、事件、计算属性等。
-
挂载阶段:在挂载阶段,Vue 会根据模板编译生成 DOM,并将数据与 DOM 进行绑定。
-
更新阶段:在更新阶段,Vue 会根据数据的变化,更新 DOM。
-
销毁阶段:在销毁阶段,Vue 会进行一些清理工作,如解绑事件、计算属性等。
以下是 Vue 组件的生命周期钩子函数:
-
beforeCreate:在创建阶段之前调用,此时 Vue 实例尚未被创建。
-
created:在创建阶段之后调用,此时 Vue 实例已经被创建,但 DOM 尚未被编译。
-
beforeMount:在挂载阶段之前调用,此时 DOM 尚未被编译。
-
mounted:在挂载阶段之后调用,此时 DOM 已经被编译,但尚未被渲染。
-
beforeUpdate:在更新阶段之前调用,此时 DOM 已经被渲染,但数据尚未被更新。
-
updated:在更新阶段之后调用,此时 DOM 已经被更新,但尚未被渲染。
-
beforeUnmount:在销毁阶段之前调用,此时 DOM 已经被渲染,但尚未被解绑。
-
unmounted:在销毁阶段之后调用,此时 DOM 已经被解绑,Vue 实例已被销毁。
总结:Vue 组件的生命周期指的是组件从创建到销毁的一系列过程,可以分为创建、挂载、更新、销毁四个阶段。在不同的生命周期阶段,Vue 会调用不同的生命周期钩子函数,我们可以通过这些钩子函数来执行一些特定的操作。
简言之:
- 创建
beforeCreate:属性和方法都不能使用
created:实例创建完成之后,可以使用和修改数据,但页面没有被渲染
- 挂载
beforemount:虚拟dom创建完成,即将渲染
mounted:把编译好的模板挂载到页面
- 更新
beforeUpdate:组件更新之前使用,数据是新的,页面上的数据是旧的,组件即将更新
updated:render重新渲染,数据和页面都是新的
- 销毁
beforeDestory:清除定时器等操作
destroyed:组件被销毁
使用keep-alive时多出两个
activited:组件激活时
deactivited:组件销毁时
四.在created和mounted去请求数据,有什么区别
在 Vue.js 中,created
和 mounted
是两个常用的生命周期钩子函数,都可以用来请求数据。但是它们之间存在一些区别。
-
调用时间:
created
钩子函数在 Vue 实例被创建后立即调用,此时 Vue 实例的data
和methods
属性已经初始化,但 DOM 尚未被编译;mounted
钩子函数在 DOM 被编译后调用,此时 Vue 实例的data
和methods
属性已经初始化,DOM 已经渲染。 -
请求数据:在
created
钩子函数中请求数据,如果请求失败,可能会导致 Vue 实例无法被创建;在mounted
钩子函数中请求数据,即使请求失败,也不会影响 Vue 实例的创建和渲染。 -
页面加载速度:在
created
钩子函数中请求数据,可能会导致页面加载速度变慢,因为请求数据需要时间;在mounted
钩子函数中请求数据,可以确保在页面加载完成后立即请求数据,从而提高页面加载速度。
总结:created
和 mounted
都可以用来请求数据,但它们之间存在一些区别。created
钩子函数在 Vue 实例被创建后立即调用,此时 Vue 实例的 data
和 methods
属性已经初始化,但 DOM 尚未被编译;mounted
钩子函数在 DOM 被编译后调用,此时 Vue 实例的 data
和 methods
属性已经初始化,DOM 已经渲染。在实际使用中,可以根据具体需求选择合适的钩子函数来请求数据。
created:渲染前调用,先初始化数据。
mounted:渲染后调用,请求数据可能会出现闪屏,created不会。
请求的数据对dom有影响,使用created,与dom无关,可以放在mounted。
五.vue组件通信
Vue 组件通信主要有以下几种方式:
- props 和 $emit:通过 props,父组件可以将数据传递给子组件;通过 $emit,子组件可以将数据传递给父组件。
<!-- 父组件 -->
<template><div><child-component :message="parentMessage"></child-component></div>
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: {ChildComponent},data() {return {parentMessage: 'Hello from parent'};}
};
</script>
<!-- 子组件 -->
<template><div>{{ message }}<button @click="sendMessage">Send message to parent</button></div>
</template><script>
export default {props: ['message'],methods: {sendMessage() {this.$emit('message-sent', 'Hello from child');}}
};
</script>
.sync
修饰符:在 Vue 2.3.0 版本中,引入了.sync
修饰符,可以简化子组件修改父组件数据的操作。
<!-- 父组件 -->
<template><div><child-component :message.sync="parentMessage"></child-component></div>
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: {ChildComponent},data() {return {parentMessage: 'Hello from parent'};}
};
</script>
<!-- 子组件 -->
<template><div>{{ message }}<button @click="sendMessage">Send message to parent</button></div>
</template><script>
export default {props: ['message'],methods: {sendMessage() {this.message = 'Hello from child';this.$emit('update:message', 'Hello from child');}}
};
</script>
- Vuex:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式与库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
// store.js
import Vue from 'vue';
import Vuex from 'vuex';Vue.use(Vuex);export default new Vuex.Store({state: {count: 0},mutations: {increment(state) {state.count++;}},actions: {increment(context) {context.commit('increment');}},modules: {count: {state: {count: 0},mutations: {increment(state) {state.count++;}},actions: {increment(context) {context.commit('increment');}}}}
});
- $root 和 $parent:通过 $root 和 $parent,可以访问到 Vue 实例的根节点和父节点。
<!-- 子组件 -->
<template><div>{{ rootMessage }}{{ parentMessage }}</div>
</template><script>
export default {inject: ['rootMessage', 'parentMessage'],created() {console.log(this.$root); // 访问根节点console.log(this.$parent); // 访问父节点}
};
</script>
总结:Vue 组件通信主要有 props
和 $emit
、.sync
修饰符、Vuex、$root 和 $parent 等方式。在实际项目中,可以根据具体需求选择合适的通信方式。
简言之:
父传子:
props
,$ref
--引用信息对象会注册在父组件$refs
对象上子传父:
$emit
—子组件绑定自定义事件,子组件绑定接收兄弟传:全局事件总线
$bus
用on和emit
来进行数据传输
六.keep-alive
keep-alive
是 Vue.js 提供的一个生命周期钩子函数,它会在组件被销毁后,将其缓存到内存中,当再次访问时,会从缓存中取出组件实例,而不是重新创建一个新的实例。这样可以减少内存的消耗,提高页面的加载速度。
keep-alive
主要用于需要频繁切换的页面,如首页、列表页等。当用户在两个页面之间频繁切换时,使用 keep-alive
可以避免频繁地创建和销毁组件实例,从而提高页面的加载速度。
要使用 keep-alive
,需要遵循以下步骤:
- 在需要缓存的组件上添加
keep-alive
属性。
<template><div><!-- 页面内容 --></div>
</template><script>
export default {name: 'MyComponent',keepAlive: true
};
</script>
- 在
keep-alive
生命周期钩子函数中,可以进行一些缓存数据的处理。
export default {name: 'MyComponent',keepAlive: true,mounted() {console.log('Component mounted');},destroyed() {console.log('Component destroyed');}
};
注意:keep-alive
主要用于需要频繁切换的页面,对于一些需要根据用户操作进行缓存的数据,可以使用 Vuex 等状态管理库进行管理。
是vue的内置组件,包裹组件时,会缓存不活跃的组件实例。
防止重复渲染、减少加载时间和性能消耗。
七. axios如何封装
Axios 是一个基于 Promise 的 HTTP 客户端,用于在浏览器和 Node.js 中发起 HTTP 请求。 Axios 具有以下特点:
- 支持 Promise API
- 支持拦截器
- 支持请求和响应的数据处理
- 支持取消请求
- 支持自动转换 JSON
下面是一个简单的 Axios 封装示例:
- 安装 Axios:
npm install axios
- 创建
axios.js
文件,封装 Axios:
import axios from 'axios';const instance = axios.create({// 基本 URLbaseURL: 'https://api.example.com',timeout: 5000,
});// 请求拦截器
instance.interceptors.request.use(function (config) {// 在发送请求之前做些什么return config;},function (error) {// 对请求错误做些什么return Promise.reject(error);}
);// 响应拦截器
instance.interceptors.response.use(function (response) {// 对响应数据做点什么return response;},function (error) {// 对响应错误做点什么return Promise.reject(error);}
);export default instance;
- 在需要使用 Axios 的地方引入封装好的 Axios:
import axios from './axios';axios.get('/users').then(function (response) {console.log(response);}).catch(function (error) {console.log(error);});
在这个示例中,我们创建了一个名为 instance
的 Axios 实例,并设置了请求拦截器和响应拦截器。然后,我们将封装好的 Axios 实例导出,以便在其他地方使用。
注意:这个示例仅作为参考,实际项目中可能需要根据具体需求进行调整。
下载axios----创建实例----封装请求和响应拦截器----封装接口-----使用
八.vue路由传参
Vue.js 中的路由传参主要有以下几种方式:
- 使用 query 参数:在路由的路径中添加 query 参数,如
/search?keyword=xxx
。在组件中,可以通过this.$route.query
获取 query 参数。
// router.js
import VueRouter from 'vue-router';
import Search from './components/Search.vue';const routes = [{path: '/search',name: 'Search',component: Search,props: true}
];const router = new VueRouter({routes
});export default router;
<!-- Search.vue -->
<template><div><h2>Search</h2><p>Keyword: {{ keyword }}</p></div>
</template><script>
export default {props: ['keyword']
};
</script>
- 使用 props:在路由的
props
属性中定义需要传递的参数,如{ keyword: String }
。在组件中,可以通过this.$route.params
获取 params 参数。
// router.js
import VueRouter from 'vue-router';
import Search from './components/Search.vue';const routes = [{path: '/search/:keyword',name: 'Search',component: Search,props: {keyword: String}}
];const router = new VueRouter({routes
});export default router;
<!-- Search.vue -->
<template><div><h2>Search</h2><p>Keyword: {{ keyword }}</p></div>
</template><script>
export default {props: ['keyword']
};
</script>
- 使用
to
属性:在路由的to
属性中,可以使用{ propName: propValue }
的形式传递参数。在组件中,可以通过this.$route.params
获取 params 参数。
// router.js
import VueRouter from 'vue-router';
import Search from './components/Search.vue';const routes = [{path: '/search',name: 'Search',component: Search,to: {name: 'Search',params: {keyword: 'xxx'}}}
];const router = new VueRouter({routes
});export default router;
<!-- Search.vue -->
<template><div><h2>Search</h2><p>Keyword: {{ keyword }}</p></div>
</template><script>
export default {props: ['keyword']
};
</script>
总结:Vue.js 中的路由传参主要有使用 query 参数、使用 props 和使用 to
属性三种方式。在实际项目中,可以根据具体需求选择合适的传参方式。
params传参:
this.$router.push({name:'',params:{}})
this.$route.params.id
路由属性传参
this.$router.push({name:'/${item.id}'})
路由配置
{path:'/index:id'}
query传参
this.$router.push({name:'index',query:{}})
九.路由hash模式和history有啥区别
路由的 hash 模式和 history 模式的主要区别在于 URL 的表现形式和浏览器的历史记录。
- URL 表现形式:
- hash 模式:URL 中会带有
#
符号,如http://example.com/#/search
。 - history 模式:URL 中不会带有
#
符号,如http://example.com/search
。
- 浏览器历史记录:
- hash 模式:在浏览器中,点击回退按钮会返回到上一个页面,而不是跳转到上一个 URL。
- history 模式:在浏览器中,点击回退按钮会跳转到上一个 URL,而不是返回到上一个页面。
总结:hash 模式和 history 模式的主要区别在于 URL 的表现形式和浏览器的历史记录。在实际项目中,可以根据具体需求选择合适的路由模式。
hash地址上有#,history没有
地址栏回车刷新时,hash会加载相应页面,history会报404
hash支持低版本浏览器,因为H5新增的API
hash不会重新加载页面
history有历史记录,可以通过pushState和replaceState(0)去修改历史记录,并不立刻发送请求
history需要后台配置
十.路由拦截
Vue.js 中的路由拦截主要通过导航守卫来实现。导航守卫是 Vue Router 提供的全局导航守卫,可以在路由导航过程中执行一些操作,如拦截导航、改变导航参数等。
Vue Router 提供了以下几种导航守卫:
- beforeEach:在导航守卫中,可以在导航到新路由之前执行一些操作。
// router.js
import VueRouter from 'vue-router';
import Search from './components/Search.vue';const routes = [{path: '/search',name: 'Search',component: Search,beforeEach: (to, from, next) => {// 在这里可以执行一些操作,如验证用户是否登录if (!userLoggedIn) {next({ name: 'Login' });} else {next();}}}
];const router = new VueRouter({routes
});export default router;
- beforeEnter:在导航守卫中,可以在导航到新路由之前执行一些操作。
// router.js
import VueRouter from 'vue-router';
import Search from './components/Search.vue';const routes = [{path: '/search',name: 'Search',component: Search,beforeEnter: (to, from, next) => {// 在这里可以执行一些操作,如验证用户是否登录if (!userLoggedIn) {next({ name: 'Login' });} else {next();}}}
];const router = new VueRouter({routes
});export default router;
- beforeRouteEnter:在导航守卫中,可以在导航到新路由之前执行一些操作。
// router.js
import VueRouter from 'vue-router';
import Search from './components/Search.vue';const routes = [{path: '/search',name: 'Search',component: Search,beforeRouteEnter: (to, from, next) => {// 在这里可以执行一些操作,如验证用户是否登录if (!userLoggedIn) {next({ name: 'Login' });} else {next();}}}
];const router = new VueRouter({routes
});export default router;
- beforeRouteUpdate:在导航守卫中,可以在导航到新路由之前执行一些操作。
// router.js
import VueRouter from 'vue-router';
import Search from './components/Search.vue';const routes = [{path: '/search',name: 'Search',component: Search,beforeRouteUpdate: (to, from, next) => {// 在这里可以执行一些操作,如验证用户是否登录if (!userLoggedIn) {next({ name: 'Login' });} else {next();}}}
];const router = new VueRouter({routes
});export default router;
- beforeRouteLeave:在导航守卫中,可以在导航离开当前路由之前执行一些操作。
// router.js
import VueRouter from 'vue-router';
import Search from './components/Search.vue';const routes = [{path: '/search',name: 'Search',component: Search,beforeRouteLeave: (to, from, next) => {// 在这里可以执行一些操作,如保存当前路由信息saveCurrentRouteInfo();next();}}
];const router = new VueRouter({routes
});export default router;
总结:Vue.js 中的路由拦截主要通过导航守卫来实现。导航守卫是 Vue Router 提供的全局导航守卫,可以在路由导航过程中执行一些操作,如拦截导航、改变导航参数等。在实际项目中,可以根据具体需求使用导航守卫来实现
router.before e ach((to,from,next)=>{})
十一.vue的动态路由
在路由配置里设置meta属性,扩展权限相关字段,在路由导航守卫里判断这个权限标识实现动态的增加和跳转路由
十二…如何解决刷新后二次加载路由
window.location.reload()matchercosnt router=createRouter()export function resetRouter(){const newRouter=creatRouter()router.matcher=newRouter.matcher}
十三.vuex刷新页面数据丢失
vuex会重新获取数据
把数据保存在浏览器缓存里cookie、localstorage、session
页面刷新时,再次请求数据,动态更新vuex里面的数据
十四.computed和watch区别
computed
和 watch
是 Vue.js 中两个重要的属性,它们都可以实现数据的双向绑定,但它们之间存在一些区别。
-
定义方式:
computed
是通过Object.defineProperty()
方法来定义的,而watch
是通过Vue.prototype.watch
方法来定义的。 -
依赖收集:
computed
属性会进行依赖收集,当依赖的数据发生变化时,会自动更新视图;而watch
属性不会进行依赖收集,需要手动触发视图更新。 -
缓存:
computed
属性会缓存计算结果,当依赖数据发生变化时,会重新计算;而watch
属性不会缓存计算结果,每次都会重新计算。 -
性能:
computed
属性性能比watch
属性高,因为它进行了依赖收集,而watch
属性需要手动触发视图更新。
总结:computed
和 watch
都可以实现数据的双向绑定,但它们之间存在一些区别。computed
属性会进行依赖收集,当依赖的数据发生变化时,会自动更新视图;而 watch
属性不会进行依赖收集,需要手动触发视图更新。computed
属性会缓存计算结果,当依赖数据发生变化时,会重新计算;而 watch
属性不会缓存计算结果,每次都会重新计算。computed
属性性能比 watch
属性高,因为它进行了依赖收集。
computed:计算属性,支持缓存,以来的属性值发生变化,计算属性会重新计算,否则用缓存,不支持异步,第一次加载就监听,函数中必须有return
watch:监听属性,监听data中数据的变化,不支持缓存,支持异步,第一次加载不监听,可以不用有return
十五.vuex使用场景和属性
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式和库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex 适用于需要共享状态的应用程序。
Vuex 具有以下属性:
-
状态(state):Vuex 通过
state
属性来定义应用程序的状态。状态可以是嵌套的对象,也可以是基本的数据类型。 -
突变(mutations):Vuex 通过
mutations
属性来定义状态的突变。突变是同步的,并且只能通过commit
方法来触发。 -
操作(actions):Vuex 通过
actions
属性来定义异步操作。操作可以触发突变,也可以执行其他异步操作。 -
模块(modules):Vuex 通过
modules
属性来定义模块。模块可以包含自己的状态、突变、操作和模块。
Vuex 适用于以下场景:
-
单页面应用程序:Vuex 适用于需要共享状态的单页面应用程序。
-
多组件应用程序:Vuex 适用于需要共享状态的多组件应用程序。
-
需要状态持久化的应用程序:Vuex 适用于需要状态持久化的应用程序。
-
需要权限控制的应用程序:Vuex 适用于需要权限控制的应用程序。
使用 Vuex 的步骤:
-
安装 Vuex:
使用 npm 或 yarn 安装 Vuex:
npm install vuex --save
或
yarn add vuex
-
创建 Vuex store:
在项目中创建一个名为
store.js
的文件,并在其中创建一个 Vuex store:import Vue from 'vue'; import Vuex from 'vuex';Vue.use(Vuex);export default new Vuex.Store({state: {},mutations: {},actions: {},modules: {} });
-
定义状态、突变、操作和模块:
在
store.js
文件中,可以定义状态、突变、操作和模块。例如:state: {count: 0 }, mutations: {increment(state) {state.count++;} }, actions: {increment(context) {context.commit('increment');} }, modules: {count: {state: {count: 0},mutations: {increment(state) {state.count++;}},actions: {increment(context) {context.commit('increment');}}} }
-
引入 store 到 main.js:
在
main.js
文件中,引入store.js
并将其添加到 Vue 实例中:import Vue from 'vue'; import App from './App.vue'; import store from './store';new Vue({store,render: h => h(App) }).$mount('#app');
-
使用 mapState、mapGetters、mapMutations 和 mapActions:
在 Vue 组件中,可以使用
mapState
、mapGetters
、mapMutations
和mapActions
辅助函数来简化代码。例如:import { mapState, mapGetters, mapMutations, mapActions } from 'vuex';export default {computed: {...mapState(['count'])},methods: {...mapMutations(['increment']),...mapActions(['increment'])} };
总结:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式和库,它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex 适用于需要共享状态的应用程序,如单页面应用程序、多组件应用程序
state:存储变量
getters:state的计算属性
mutations:提交更新数据的方法,同步
actions:异步操作
modules:模块化vuex
用户个人信息、购物车等
十六.vue双向绑定的原理
Vue.js 中的双向绑定是通过 Object.defineProperty() 方法实现的。这个方法可以让我们在访问或修改一个属性时执行一些自定义操作。Vue.js 利用这个方法实现了数据的双向绑定。
具体来说,Vue.js 会将数据对象中的每个属性转换为 getter 和 setter,从而实现数据的双向绑定。当数据对象中的属性被访问或修改时,getter 和 setter 会被触发,从而更新视图。
以下是一个简单的示例:
class Vue {constructor(data) {this.data = data;for (const key in data) {Object.defineProperty(this, key, {get() {return this.data[key];},set(value) {this.data[key] = value;}});}}
}const vm = new Vue({data: {count: 0}
});console.log(vm.count); // 输出 0
vm.count = 1;
console.log(vm.count); // 输出 1
在这个示例中,我们创建了一个简单的 Vue 类,它将数据对象中的每个属性转换为 getter 和 setter。当我们访问或修改 vm.count
时,getter 和 setter 会被触发,从而更新视图。
Vue.js 利用这个原理实现了数据的双向绑定,从而实现数据和视图的同步。
通过数据劫持结合发布者订阅者模式,利用object.defineProperty()劫持各个属性的setter和getter,在数据发生变化时发布消息给订阅者,触发相应的监听回调渲染视图。
十七.diff和虚拟dom
diff
和虚拟 DOM 是前端性能优化的重要技术。diff
算法用于计算新旧 DOM 之间的差异,从而实现最小化页面重排和重绘。虚拟 DOM 是一种模拟 DOM 的技术,它将实际 DOM 转换为虚拟 DOM,然后在虚拟 DOM 上进行操作,最后将虚拟 DOM 转换回实际 DOM。
diff
算法的核心思想是将新旧 DOM 进行比较,找出它们之间的差异,然后将差异应用到实际 DOM 上。diff
算法的实现方式有很多,如深度优先搜索(DFS)、广度优先搜索(BFS)等。
虚拟 DOM 的实现方式是将实际 DOM 转换为虚拟 DOM,然后将虚拟 DOM 存储在内存中。当需要更新 DOM 时,先将新的虚拟 DOM 转换回实际 DOM,然后将新 DOM 与旧 DOM 进行比较,找出差异,最后将差异应用到实际 DOM 上。
以下是一个简单的示例:
// 假设这是实际 DOM
const oldDom = document.createElement('div');
oldDom.innerHTML = '<p>Hello, World!</p>';// 创建虚拟 DOM
const vdom = {type: 'div',props: {},children: [{type: 'p',props: {},children: ['Hello, World!']}]
};// 将虚拟 DOM 转换回实际 DOM
const newDom = createElement(vdom);// 比较新旧 DOM,找出差异
const patches = diff(oldDom, newDom);// 将差异应用到实际 DOM 上
applyPatches(oldDom, patches);
在这个示例中,我们首先创建了一个实际 DOM 和一个虚拟 DOM。然后,我们将虚拟 DOM 转换回实际 DOM,并比较新旧 DOM,找出差异。最后,我们将差异应用到实际 DOM 上。
通过使用 diff
和虚拟 DOM,我们可以实现前端性能优化,减少页面重排和重绘。
虚拟dom,描述元素与元素之间的关系,创建的一个js对象。
如果组件内有响应的数据,数据发生改变时,render函数会生成一个新的虚拟dom,新的虚拟dom会和旧的虚拟dom进行比对,找到需要修改的虚拟dom内容,然后去对应的真实dom中修改。
diff是虚拟dom对比时用的,返回一个patch对象来存储两个节点不同的地方,最后用patch里的记录信息更新真实dom。
十八.vue和jquery的区别
Vue.js 和 jQuery 都是前端流行的 JavaScript 库,但它们之间存在一些关键区别。
-
核心思想:Vue.js 的核心思想是数据绑定和视图渲染,而 jQuery 的核心思想是选择器、操作 DOM 和事件处理。
-
语法:Vue.js 使用基于 HTML 的模板语法,而 jQuery 使用基于 CSS 的选择器语法。
-
数据绑定:Vue.js 支持数据双向绑定,而 jQuery 不支持。
-
视图渲染:Vue.js 支持组件化和响应式视图,而 jQuery 不支持。
-
性能:Vue.js 的性能通常比 jQuery 更高,因为它使用了虚拟 DOM 和优化了 DOM 操作。
-
社区支持:Vue.js 拥有庞大的社区支持,而 jQuery 的社区支持正在逐渐减少。
-
兼容性:Vue.js 支持现代浏览器,而 jQuery 支持旧版浏览器。
总结:Vue.js 和 jQuery 都是前端流行的 JavaScript 库,但它们之间存在一些关键区别。Vue.js 更注重数据绑定和视图渲染,而 jQuery 更注重选择器、操作 DOM 和事件处理。在性能、社区支持和兼容性等方面,Vue.js 通常比 jQuery 更具优势。
原理不同:vue就是数据绑定,jq时先获取dom在处理。
着重点不同:vue是数据驱动,jq着重于页面。
操作不同
十九.vuex的响应式处理
触发事件的时候会通过dispatch来访问action中的方法,actions中的commit会触发mutations中的方法从而修改state里的值,通过getter把数据更新到视图
相关文章:

vue前端面试
一 .v-if和v-show的区别 v-if 和 v-show 是 Vue.js 中两个常用的条件渲染指令,它们都可以根据条件决定是否渲染某个元素。但是它们之间存在一些区别。 语法:v-if 和 v-show 的语法相同,都接收一个布尔值作为参数。 <div v-if"show…...

【网络安全】Host碰撞漏洞原理+工具+脚本
文章目录 漏洞原理虚拟主机配置Host头部字段Host碰撞漏洞漏洞场景工具漏洞原理 Host 碰撞漏洞,也称为主机名冲突漏洞,是一种网络攻击手段。常见危害有:绕过访问控制,通过公网访问一些未经授权的资源等。 虚拟主机配置 在Web服务器(如Nginx或Apache)上,多个网站可以共…...

unattended-upgrade进程介绍
unattended-upgrade 是一个用于自动更新 Debian 和 Ubuntu 系统的软件包。这个进程通常用于定期下载并安装安全更新,以保持系统的安全性和稳定性。 具体来说,这个命令 /usr/bin/python3 /usr/bin/unattended-upgrade --download-only 表示运行 unattend…...

SpringBoot 中多例模式的神秘世界:用法区别以及应用场景,最后的灵魂拷问会吗?- 第519篇
历史文章(文章累计500) 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 《…...

基于STM32设计的智能婴儿床(ESP8266局域网)_2024升级版_180
基于STM32设计的智能婴儿床(采用STM32F103C8T6)(180) 文章目录 一、设计需求【1】项目功能介绍【2】程序最终的运行逻辑【3】硬件模块组成【4】ESP8266模块配置【5】上位机开发思路【6】系统功能模块划分1.2 项目开发背景1.3 开发工具的选择1.4 系统框架图1.5 系统原理图1.6 硬…...

C++(第四天----拷贝函数、类的组合、类的继承)
一、拷贝构造函数(复制构造函数) 1、概念 拷贝构造函数,它只有一个参数,参数类型是本类的引用。如果类的设计者不写拷贝构造函数,编译器就会自动生成拷贝构造函数。大多数情况下,其作用是实现从源对象到目…...

第一课:接口配置IP地址:DHCP模式
希望pc1,pc2,pc3自动分配到ip地址。 实验拓扑: 配置:高级一点的路由器还是手动配置: [R1]int g0/0/0 [R1-g0/0/0]ip address 192.168.1.1 255.255.255.0 打开PC1,切换到DHCP模式,点击应用,再到命令行输入ipconfig&…...

esp32_spfiffs
生成 spiffs image python spiffsgen.py <image_size> <base_dir> <output_file> eg, python spiffsgen.py 0x2000 ./folder hello.bin Arduino 的库有例子可以直接用于 OTA 升级 spiffs 分区 HTTPUpdateResult HTTPUpdate::updateSpiffs(HTTPClient &h…...

每日一练全新考试模式解锁|考试升级
🙋频繁有小伙伴咨询:我想举办一场历时一个月的答题活动,学生可以每天打开答题,活动完结后可以导出每天的答题成绩 此前我们都会让小伙伴创建30场考试,然后使用批量分享功能组合起来,对外分享一个链接就可以…...

pyqt5图片分辨率导致的界面过大的问题
项目场景:pyqt5的图片分辨率和屏幕分辨率问题 提示:这里简述项目相关背景:图片分辨率:500*500;显示屏分辨率:600;导致界面显示不全; 在其他高分辨率显示屏中没有这个问题。 问题描述…...

(三)前端javascript中的数据结构之集合
集合的特点 1.无序 2.唯一性 3.不可重复 集合相对于前面几种数据结构,比较简单好理解,看看代码实现就能知道他的用法了 集合的创建 function MySet() {this.item {}; } MySet.prototype.has function (value) {return value in this.item; };//增 M…...

VuePress 的更多配置
现在,读者应该对 VuePress、主题和插件等有了基本的认识,除了插件,VuePress 自身也有很多有用的配置,这里简单说明下。 VuePress 的介绍 在介绍了 VuePress 的基本使用、主题和插件的概念之后,我们再来看看官…...

问题解决|Python 代码的组织形式与编码规范
一、Python中组织形式 (一)组织形式(函数,类,模块,包,库)概览 (1)概览 组织形式描述特点或用途例子函数一段具有特定功能的代码块,可以接受参数…...

Flask项目搭建及部署 —— Python
flask搭建及部署 pip 19.2.3 python 3.7.5 Flask 1.1.1 Flask-SQLAlchemy 2.4.1 Pika 1.1.0 Redis 3.3.11 flask-wtf 0.14.2 1、创建flask项目: 创建完成后整个项目结构树: app.py: 项⽬管理⽂件,通过它管理项⽬。 static: 存放静态…...

【C++报错已解决】Invalid Use of ‘this’ Pointer
🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 引言 一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:修正‘this’指针使用2…...

群晖NAS配置WebDav服务结合内网穿透实现跨平台云同步思源笔记
文章目录 前言1. 开启群晖WebDav 服务2. 本地局域网IP同步测试3. 群晖安装Cpolar4. 配置远程同步地址5. 笔记远程同步测试6. 固定公网地址7. 配置固定远程同步地址 前言 本教程主要分享如何将思源笔记、cpolar内网穿透和群晖WebDav三者相结合,实现思源笔记的云同步…...

内容监管与自由表达:Facebook的平衡之道
在当今数字化信息社会中,社交媒体平台不仅是人们交流和获取信息的主要渠道,也是自由表达的重要舞台。Facebook,作为全球最大的社交网络平台,连接了数十亿用户,形成了一个丰富多样的信息生态。然而,如何在维…...

电脑桌面日历记事本怎么弄 好用的桌面日历记事本
在这个数字化的时代,电脑已成为我们日常生活中不可或缺的伙伴。我常常在电脑上记录各种事项,以便随时查看和提醒自己。而我最钟爱的记事方式,莫过于使用桌面日历记事本。 想象一下,你的电脑桌面上有一个直观的日历,每…...

#招聘数据分析#2024年6月前程无忧招聘北上广深成渝对比情况
#招聘数据分析#2024年6月前程无忧招聘北上广深成渝对比情况 0、根据前程无忧不完全样本统计,北上广深成都重庆平均月工资从高到低依次为 北京15441元、上海14425元、深圳13310元、广州11192元、成都10539元、重庆10290。 1、成都招聘样本数全量35228个,…...

STM32 IIC详解(软件模拟)
目录 一、IIC协议基本原理 1.IIC协议概述 2.时序图分析 二、代码分析 1.IIC初始化 2.IIC起始信号 3.IIC发送数据 4.获取应答信号 5.读一个字节 6.产生ACK应答 7.不产生ACK应答 IIC(Inter-Integrated Circuit)在嵌入式系统中是一种常见的数据通…...

推三返一小程序商城开发搭建
推三返一小程序商城开发主要涉及到以下几个步骤: 确定需求和功能: 首先需要明确小程序商城的开发需求和功能。商家需要思考自己想要实现什么功能,例如推广、销售、裂变等。 同时还需要考虑小程序的页面设计、用户体验等方面。 选择合适的开…...

项目机会:4万平:智能仓,AGV,穿梭车,AMR,WMS,提升机,机器人……
导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。 如下为近期国内智能仓储物流相关项目的公开信息线索,这些项目具体信息会发布到知识星球,请感兴趣的球友先人一步到知识星球【智能仓储物流技术研习社】自行下载…...

[工具类]Java 合并、拆分PPT幻灯片
本文将介绍在Java程序中如何来合并及拆分PPT文档的方法。示例大纲: 1. 合并 1.1 将指定幻灯片合并到文档 1.2 合并多个幻灯片文档为一个文档 2. 拆分 2.1 按幻灯片每一页单独拆分为一个文档 2.2 按指定幻灯片页数范围来拆分为多个文档 使用工具:F…...

深入了解 Timber:全面掌握 Android 日志记录的最佳实践
深入了解 Timber:全面掌握 Android 日志记录的最佳实践 Timber 是由 Jake Wharton 提供的一个流行的 Android 日志记录库。它旨在简化日志记录、增强日志管理,并提高代码的可维护性。在本文中,我们将深入探讨 Timber 的功能、使用方法以及最…...

阿一课代表随堂分享:红队反向代理之使用frp搭建反向代理
frp反向代理 frp简介 frp 是一个开源、简洁易用、高性能的内网穿透和反向代理软件,支持 tcp, udp, http, https等协议。 frp 是一个可用于内网穿透的高性能的反向代理应用,分为服务端frps和客户端frpc,支持 tcp, udp, http, https 协议。详…...

基于vue的引入登录界面
以下是一些常见的登录页面布局: 1. 中心布局 - 登录表单位于页面的中心位置,通常包括用户名输入框、密码输入框、登录按钮等元素。页面背景简洁,以突出登录表单。 - 这种布局常见于大多数网站和应用,简洁明了,用户注意…...

centos7升级到欧拉openeule
centos7升级到欧拉openeule 一、准备工作 1、安装迁移工具(安装迁移工具的机器不能给自己升级,请用其他机器作为迁移母机) wget https://repo.oepkgs.net/openEuler/rpm/openEuler-20.03-LTS-SP1/contrib/x2openEuler/x86_64/Packages/x2…...

阿里云 Ubuntu 开启允许 ssh 密码方式登录
以前用的 centos,重置系统为 ubuntu 后在ssh 远程连接时遇到了点问题: 在阿里云控制台重置实例密码后无法使用密码进行 SSH 连接登录 原因:阿里云 Ubuntu 默认禁用密码登录方式 解决办法: 先使用其他用户登录到服务器 这里进来…...

利用投标相似度辅助围串标判定
摘要 围标(bid rigging)是一种非法的竞争行为,对市场公平性和公共资源分配造成严重影响。本文探讨了如何利用投标相似度来辅助判定围标行为。通过详细分析投标文件的内容相似性,选取适当的指标进行相似度计算,并结合实…...

iOS 开发者的 Flutter 入门课
作为一名 iOS 开发者,入门 Flutter 需要了解一些新的工具和概念,但也能利用你已有的知识和技能。以下是一个详细的入门指南,帮助你快速上手 Flutter: 1. 环境设置 首先,你需要设置开发环境。 安装 Flutter SDK 前往…...