MVVM 是 Model-View-ViewModel 的缩写。 Model代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑。 View 代表UI 组件,它负责将数据模型转化成UI 展现出来。 ViewModel 监听模型数据的改变和控制视图行为、处理用户交互,简单理解就是一个同步View 和 Model的对象,连接Model和View。 在MVVM架构下,View 和 Model 之间并没有直接的联系,而是通过ViewModel进行交互,Model 和 ViewModel 之间的交互是双向的, 因此View 数据的变化会同步到Model中,而Model 数据的变化也会立即反应到View 上。 ViewModel 通过双向数据绑定把 View 层和 Model 层连接了起来,而View 和 Model 之间的同步工作完全是自动的,无需人为干涉,因此开发者只需关注业务逻辑,不需要手动操作DOM, 不需要关注数据状态的同步问题,复杂的数据状态维护完全由 MVVM 来统一管理。
Object.defineProperty(obj,prop,descriptor) 参数 obj:目标对象 prop:需要定义的属性或方法的名称 descriptor:目标属性所拥有的特性 可供定义的特性列表 value:属性的值 writable:如果为false,属性的值就不能被重写。 ⭐get: 一旦目标属性被访问就会调回此方法,并将此方法的运算结果返回用户。 ⭐set:一旦目标属性被赋值,就会调回此方法。 configurable: 如果为false,则任何尝试删除目标属性或修改属性性以下特性(writable, configurable, enumerable)的行为将被无效化。 enumerable: 是否能在for...in循环中遍历出来或在Object.keys中列举出来。
<body>
<div id="app">
<input type="text" id="txt">
<p id="show"></p>
</div>
</body>
<script type="text/javascript">
var obj = {}
Object.defineProperty(obj, 'txt', {
get: function () {
return obj
},
set: function (newValue) {
document.getElementById('txt').value = newValue
document.getElementById('show').innerHTML = newValue
}
})
document.addEventListener('keyup', function (e) {
obj.txt = e.target.value
})
</script>
四个阶段
1)实例创建 2)DOM渲染 3)数据更新 4)销毁实例
八个钩子函数
1.beforeCreate --创建前 触发的行为:vue实例的挂载元素$el和数据对象data都为undefined,还未初始化。 在此阶段可以做的事情:加loading事件
2.created --创建后 触发的行为:vue实例的数据对象data有了,$el还没有 在此阶段可以做的事情:解决loading,请求ajax数据为mounted渲染做准备
3.beforeMount --渲染前 触发的行为:vue实例的$el和data都初始化了,但还是虚拟的dom节点,具体的data.filter还未替换 在此阶段可以做的事情:。。。
4.mounted --渲染后 触发的行为:vue实例挂载完成,data.filter成功渲染 在此阶段可以做的事情:配合路由钩子使用
5.beforeUpdate --更新前 触发的行为:data更新时触发 在此阶段可以做的事情:。。。
6.updated —更新后 触发的行为:data更新时触发 在此阶段可以做的事情:数据更新时,做一些处理(此处也可以用watch进行观测)
7.beforeDestroy —销毁前 触发的行为:组件销毁时触发 在此阶段可以做的事情:可向用户询问是否销毁
8.destroyed —销毁后 触发的行为:组件销毁时触发,vue实例解除了事件监听以及和dom的绑定(无响应了),但DOM节点依旧存在 在此阶段可以做的事情:组件销毁时进行提示
1.父组件与子组件传值 父组件传给子组件:子组件通过props方法接受数据; 子组件传给父组件:$emit方法传递参数 2.非父子组件间的数据传递,兄弟组件传值 eventBus,就是创建一个事件中心,相当于中转站,可以用它来传递事件和接收事件。项目比较小时,用这个比较合适。(虽然也有不少人推荐直接用VUEX,具体来说看需求咯。技术只是手段,目的达到才是王道。)
hash模式:在浏览器中符号“#”,#以及#后面的字符称之为hash,用window.location.hash读取; 特点:hash虽然在URL中,但不被包括在HTTP请求中;用来指导浏览器动作,对服务端安全无用,hash不会重加载页面。 hash 模式下,仅 hash 符号之前的内容会被包含在请求中,如 http://www.xxx.com,因此对于后端来说,即使没有做到对路由的全覆盖,也不会返回 404 错误。
history模式:history采用HTML5的新特性;且提供了两个新方法:pushState(),replaceState()可以对浏览器历史记录栈进行修改,以及popState事件的监听到状态变更。 history 模式下,前端的 URL 必须和实际向后端发起请求的 URL 一致,如 http://www.xxx.com/items/id。后端如果缺少对 /items/id 的路由处理,将返回 404 错误。Vue-Router 官网里如此描述:“不过这种模式要玩好,还需要后台配置支持……所以呢,你要在服务端增加一个覆盖所有情况的候选资源:如果 URL 匹配不到任何静态资源,则应该返回同一个 index.html 页面,这个页面就是你 app 依赖的页面。”
首页可以控制导航跳转,beforeEach,afterEach等,一般用于页面title的修改。一些需要登录才能调整页面的重定向功能。 beforeEach主要有3个参数to,from,next: to:route即将进入的目标路由对象, from:route当前导航正要离开的路由 next:function一定要调用该方法resolve这个钩子。执行效果依赖next方法的调用参数。可以控制网页的跳转。
共同点:都是放静态资源的 不同点: