Single Page Application
SPA
SEO
搜索引擎搜索,蜘蛛会爬链接存在既有价值
不要去排斥SEO
搜索单页面是比较复杂的,需要有技术支撑
1.0
版本2.0
版本2.5.10
"scripts": {
"dev": "browser-sync start --server --files \"*.html, css/*.css, js/*.js\""
"start": "npm run dev"
},
在 Vue 中除了核心功能默认内置的指令,也允许注册自定义指令。
有的情况下,我们仍然需要对普通 DOM 元素进行底层操作,这时候就有要用到自定义指令。
什么时候需要自定义指令?
记好了:当你需要不可避免的操作 DOM 的时候,使用自定义指令来解决
如何注册和使用自定义指令?
1. 注册
全局注册,在任何组件中都可以使用全局注册自定义指令
局部注册,只能在当前组件使用该指令
如果需要在多个不同的组件中使用该指令,则把它定义为全局的
非通用的,不需要多次使用的指令我们定义到局部
到底是否通用取决于你的功能业务
2. 使用
// 模拟 v-show 实现,根据值的真假来显示或者隐藏作用该指令的元素
Vue.directive('my-show', {
// bind 和 inserted 的相同之处是一上来都执行一次,以后再也不会执行
// 异同之处在于,bind 拿不到父元素,inserted 可以拿到父元素
bind (el, binding) {
// console.log('my-show bind', el, binding)
// if (binding.value) {
// el.style.display = 'block'
// } else {
// el.style.display = 'none'
// }
},
inserted (el, binding) {
console.log('my-show inserted')
if (binding.value) {
el.style.display = 'block'
} else {
el.style.display = 'none'
}
},
// 紧接着我们发现 update 和 componentUpdated 只有在指令的绑定的值发生更新的时候才会触发调用
// update 和 componentUpdated 的区别是:
// update 中获取的是更新的之前的指令所在的 DOM 内容
// componentUpdated 获取的是更新之后的最新 DOM 内容
//
// update 拿到的是数据改变视图之前的视图内容
// componentUpdated 拿到的是数据改变视图之后的视图内容
// 也就是说如果你需要获取数据改变视图之前的内容,则把代码写到 update 中
// 如果需要获取数据改变视图之后的内容,则把代码写到 componentUpdated 里面
update (el, binding) {
// console.log('my-show update', el, binding)
console.log('my-show update', el.innerHTML)
if (binding.value) {
el.style.display = 'block'
} else {
el.style.display = 'none'
}
},
componentUpdated (el, binding) {
console.log('my-show componentUpdated', el.innerHTML)
},
unbind () {
console.log('my-show unbind')
}
})
模板二:
Vue.directive('demo', {
// bind 和 inserted 都会先自动执行一次,bind 先,inserted 随后,注意:只执行一次,以后再也不会调用
// 两种的区别就是:
// bind 拿不到父元素
// inserted 可以拿到父元素
bind(el, binding) {
console.log('bind', el.parentNode) // null
el.timer = setInterval(function () {
console.log(1)
}, 1000)
},
inserted: function (el) {
console.log('inserted', el.parentNode) // ...
},
// update 和 componentUpdated 两者几乎一样,都是当作用该指令的模板发生更新的时候会触发调用
// 说白了就是指令所处的被 Vue 管理的模板
//
update(el, binding) {
console.log('update', el.innerHTML) // 'Hello Vue.js!'
},
componentUpdated(el, binding) {
console.log('componentUpdated', el.innerHTML) // 'Hello'
},
unbind(el, binding) {
// 在这里可以做一些收尾工作
window.clearInterval(el.timer)
console.log('unbind')
}
})
如果只关心 bind
和 inserted
,所以可以这样简写:
其它不能简写:
// 我只关心 bind 和 inserted,所以可以这样简写
Vue.directive('my-show', function (el, binding) {
// console.log('my-show update', el, binding)
// console.log('my-show update', el.innerHTML)
if (binding.value) {
el.style.display = 'block'
} else {
el.style.display = 'none'
}
})
完整的 TODOmvc 案例代码太多,需要联系私发