随着组件化模式的发展,越来越多的模式依赖以组件化的开发模式;最典型的例子就是vue脚手架的组件化开发已经慢慢成为了前端的必备技能
但有多种情况是我们没有用vue脚手架去做的项目,例如 前后端的混合模式,我们的代码与后端的代码共同组成一个项目,我们就没有办法使用,又或者我们明确的需求表明我们的网站的开发,不可以使用vue脚手架的模式,接下来我们该怎么使用vue的组件化开发模式
当我们不能使用vue脚手架,我们怎么使用引入 jquery,vue 的原生文件来做这样的事
核心思想,Vue.extend({}) 再次注册组件,为 .html 的文件格式, $.ajax() 用于获取 .html 的文件内容,然后加入到 body 标签下面,用于加载此文件,从而完成 组件化的 开发 和 引入
再次我们需要用两个文件来做这样的事
这是我们的主文件 index.html
以下方式是可以兼容到 ie9 的写法,目前没有碰到过要兼容到更低版本的需求,不过我们可以加浏览器的升级提示,如果小于ie9,提醒升级
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title> 原生vue组件的开发模式 </title>
<!-- 先引入 Vue jquery 插件-->
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
</head>
<body>
<div id="app">
<!-- 子组件 -->
<parent></parent>
</div>
</body>
<script>
// 定义了全局变量,用于存放组件
var components = {};
// 封装了此方法,同步的请求了 .html 文件的内容,注意:不能使用异步请求
function load(a){
for(var i=0;i<a.length;a++){
$.ajax({
url: a[i],
async: false,
success: function(res){
// 在body下插入获取到 .html 文件的内容,浏览器会自动解析html标签
$('body').append(res);
}
})
}
}
// 此封装的核心价值为按需加载,我不会一开始将所有组件都加载进来,但是加载进来的组件,我们就可以不用进行加载
// 具体的判断方式,判断 components 的全局变量,如果有这个组件,就可以不调用这个方法
load(['./07.html'])
new Vue({
el: '#app', // 这个是主组件,也是父组件
data: function(){
return {
}
},
components: {
// 如果组件的名称为驼峰式命名法,组件名称要用 - 隔开 如 tabList 标签名为 <tab-list>
'parent':components.parents // 子组件
}
})
</script>
</html>
接下来我们看看vue 的组件写法,相信大家也看到了路径的格式,我们在当前的文件下创建一个 07.html 内容如下
<style type="text/css">
.a{
color: red;
}
</style>
<!-- 推荐使用此方式 如果使用 template 标签会报错 -->
<script type="text/template" id="com">
<div> {{a}} </div>
<!-- 这里面就可以使用 vue 的方式 -->
</script>
<script>
// 在主文件的 components 变量中赋值给 parents 属性,是为了按需加载及防止2次加载
components.parents = Vue.extend({ // Vue.extend 的方式最好,Vue.components 的方式也是会报错
template: '#com', // 此 id 对象 script模版的 id
data: function(){ // 此后面的写法跟vue组件的写法一模一样,
return {
a: '啊啊啊'
}
},
})
</script>
这是经历了两场项目的细心琢磨最好的解决方法,尝试了所有方法,此方法便于维护,所有的代码及思想写法都给了跟我一样爬坑的人,坑坑洼洼洼洼坑坑,只为下次写更好、更完美项目,加油打工人
-------------------》
写一下还需要攻克的问题或者避免左右的坑
ie9的placeholder 的问题:不支持这样的写法,当使用 v-if 会出现网上的方法就是出问题
本地存储,当使用ifream 的使用,我们可能在里面使用了第三方的域名,第三方域名下的本地存储在浏览器无痕模式下会有问题
window.open 方法,打开新的窗口的限制,必须是用户的行为(例如 点击事件)后5秒内可以打开新窗口,5秒后失效