定义
props:{name: String}
更新:$emit('update:name', 'xxxxx')
调用组件时::name.sync="name"
定义:
props:{name: String},emits:['update:name'],
更新:$emit('update:name', 'xxxxx')
调用组件时:v-model:name="name"
参考分页控件
// getCurrentInstance 获取当前实例
import { getCurrentInstance } from ‘vue’
const { ctx } = getCurrentInstance()
ctx.$xxxx
错误写法:
const name= ref('')
const body = reactive({
params: name.value // 会丢失响应
})
正确写法:
const name= ref('')
const body = reactive({
params: name
})
let body = reactive({
params: 'text'
})
错误: body = {}
正确:body.params = 'text2'
这里我们可以封装一个函数用来快速赋值 reactive,并且页面会响应。代码如下:
/**
* 将reactiveObj对象转换成targetObj对象的格式
* 为解决 reactiveObj直接赋值targetObj还能在页面上进行响应
* @param {reactive} reactiveObj [setup中需要赋值的reactive对象]
* @param {Object} targetObj [目标对象]
*/
export const setReactiveObj = (reactiveObj, targetObj) => {
if (Array.isArray(targetObj)) {
if (reactiveObj && reactiveObj.length) {
reactiveObj.length = 0
}
}
for (const key in targetObj) {
if (Object.hasOwnProperty.call(targetObj, key)) {
const val = targetObj[key]
reactiveObj[key] = val
}
}
}
// 用法也很简单,例子如下
// 打开配置页
function openDrawer(row) {
drawer.value = true
setReactiveObj(rowData, row) // rowData 是 reactive响应式代理对象,row是普通的对象
getInfo(rowData.id)
}
只需要在vue.config.js里面配置下面这句即可
// 解决打包生产环境的时候报错 __INTLIFY_PROD_DEVTOOLS__ is not defined
new webpack.DefinePlugin({
__INTLIFY_PROD_DEVTOOLS__: JSON.stringify(false)
})
完整代码下图

在vue3中,父子组件传值的props和emits写法更加规范(命名更统一),体现在:v-model的变化
<template>
<child-component v-model:value="myValue"></child-component>
</template>
v-model:value等同于props:'value'和emits('update:value')
需要指定emits,为了便于管理,建议在emits中定义所有用到的emit
export default {
emits: ['update:value', 'otherEmit'],
setup(props, { emit }) {
emit('update:value')
emit('otherEmit')
},
}
事件监听器也被包含还在了$attrs中,现在属性透传更方便了
如果想访问子组件,使用$refs。
$on,$off,$once不再使用。2.x的EventBus方法不能再使用。
不能再用|使用filter。Sad。
watch 选项侦听数组时,只有在数组被替换时才会触发回调。换句话说,在数组被改变时侦听回调将不再被触发。要想在数组被改变时触发侦听回调,必须指定 deep 选项watch: {
bookList: {
handler(val, oldVal) {
console.log('book list changed')
},
deep: true
},
}
Vue DevTools failed to load SourceMap: Could not load content : net::ERR_FILE_NOT_FOUND"错误发生错误的原因是vue.config中的publicPath配置成了 '/'
1.解决办法 修改vue.config中的publicPath:"./"
module.exports = {
publicPath: './', //部署项目的时候的基本url,替代原来的Baseurl,默认是'/'
}
并不是只在切换的时候才加载。他的原理是显示隐藏,类似 v-show,如果需要避免这个情况则可以使用 动态组件方式:
<components :is="xxx">参考
src\modules\physical-model\components\model-config-drawer\index.vue组件
import {} from ''
@submit.prevent,阻止默认行为。 参考组件:src\modules\physical-model\components\add-attr-dialog\index.vue
onBeforeMount(async () => {
isLoginControl()
.then((r) => {
show.value = true
})
.catch((err) => {
console.log(err)
})
})
声明了 async 但是函数里面并没有结合 await 使用。运行的时候不报错,只有在打包生产的时候才报错,因为打包生产的时候 vue cli 内部会做一些优化处理。
报错如下图

return 出去了。虽然不会直接报错,但是会报不存在警告,容易引起一些列 bug。列如为什么组件值 undefined 啊,拿不到方法等。export default defineComponent({
name:'add-devices-dialog',
components:{
UploadConfigTable,
SelectTemplateDialog
},
emits: ['handleClick', 'handleDeviceTotal'], // 显示声明
setup(props, context) {
let active = ref(0)
let showDialog = ref(false)
const addForm = ref(null)
let selectTemplateRefs = ref(null)
let uploadConfigTableDevice = ref(null)
}
prop跟event处理器参数时,需要区分一下。请注意看下图说明,如十一点中声明 emits,在模板中是使用小写横线分割。在 js 中使用驼峰命名。所以在项目中我们可以看到 js 中组件名字是驼峰命名,在模板中是使用小写横线分割,所以注意下
传送门:computed 与 watch 的区别
传送门:vue3 中 watch、watchEffect 区别
import _cloneDeep from 'lodash/cloneDeep'深克隆来解决。项目中全局搜索_cloneDeep 即可错误写法:
<el-radio :label="0" v-model="argsForm.rwType" disabled>读写</el-radio>
<el-radio :label="1" v-model="argsForm.rwType" disabled>只读</el-radio>
<el-radio :label="2" v-model="argsForm.rwType" disabled>只写</el-radio>
正确写法
<el-radio-group v-model="argsForm.rwType" disabled>
<el-radio :label="0">读写</el-radio>
<el-radio :label="1">只读</el-radio>
<el-radio :label="2">只写</el-radio>
</el-radio-group>
1、查看是否使用了动态组件
<component :is="xx">这种方式
2、 是否使用了<keep-alive></keep-alive>包裹
解决方式,一般只需要在<component> </component>绑定 key 即可。
如下面代码
<keep-alive :include="tagsList">
<component :is="Component" :key="route.name" />
</keep-alive>
如果上面没有:key 则可能会偶尔报错。
__INTLIFY_PROD_DEVTOOLS__ is not defined
解决方式需要在 webpack 配置中增加如下配置代码
// 解决打包生产环境的时候报错 __INTLIFY_PROD_DEVTOOLS__ is not defined new webpack.DefinePlugin({
__INTLIFY_PROD_DEVTOOLS__: JSON.stringify(false)
}),
import { toRefs } from 'vue'
export default {
props: {
currentId: {
type: String,
default: ''
}
},
setup(props) {
const { currentId } = toRefs(props)
console.log(currentId.value)
}
}
- 在组件上声明其 ref
- 在 setup 函数中创建 与组件 ref 同名 ref 对象 并导出
<template>
<!-- 同名ref -->
<test1 ref="test1Ref"></test1>
</template>
<script>
import { ref } from 'vue'
// 导入组件
import test1 from './test1'
export default {
// 注册组件
components: { test1 },
setup () {
// 创建同名ref
const test1Ref = ref(null)
// 导出ref
return {
test1Ref
}
}
}
</script>
// 如下通过setDate方法直接更改变量值不会生效,页面不会更新
eleData.params.startTime.setDate(eleData.params.startTime + 1)
// 需要重新赋值,页面上才会更新
eleData.params.startTime = new Date(newStartTime)
eleData.params.endTime = new Date(newEndTime)
在setup中函数尽量使用function声明,因为使用let或者const声明的话,虽然变量会被提升,但是如果在初始化之前调用变量就会形成一个暂时性死区。导致报错。如果原来是正常运行着的。但是依赖升级或者重新安装之后出现了这个错误。那肯定就是这个原因造成的。所以大家在写代码的时候一定要注意一下。变量声明一定要放在最上方。函数尽量使用function。不要哪里用到了就在哪里去声明。写过后端的童鞋们都会有个习惯就是变量的声明都是放在最前面。
ps容易出现错误
如下:
ReferenceError: Cannot access ‘xxx‘ before initialization
拓展知识点:
- var的创建和初始化被提升,赋值不会被提升。
- let的创建被提升,初始化和赋值不会被提升。
- function的创建、初始化和赋值均会被提升。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
前置步骤我们都操作完了,这篇开始介绍jenkins的集成。话不多说,看操作1、登录进入jenkins后会让你选择安装插件,选择第一个默认的就行。安装完成后设置账号密码,重新登录。2、配置JDK和Git都需要执行路径,所以需要先把执行路径找到,先进入服务器的docker容器,2.1JDK的路径root@69eef9ee86cf:/usr/bin#echo$JAVA_HOME/usr/local/openjdk-82.2Git的路径root@69eef9ee86cf:/#whichgit/usr/bin/git3、先配置JDK和Git。点击:ManageJenkins>>GlobalToolCon
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
我正在尝试为我的iOS应用程序设置cocoapods但是当我执行命令时:sudogemupdate--system我收到错误消息:当前已安装最新版本。中止。当我进入cocoapods的下一步时:sudogeminstallcocoapods我在MacOS10.8.5上遇到错误:ERROR:Errorinstallingcocoapods:cocoapods-trunkrequiresRubyversion>=2.0.0.我在MacOS10.9.4上尝试了同样的操作,但出现错误:ERROR:Couldnotfindavalidgem'cocoapods'(>=0),hereiswhy:U
这太简单了,太荒谬了,我在任何地方都找不到关于它的任何信息,包括API文档和Rails源代码:我有一个:belongs_to关联,我开始理解当您没有关联时您在Controller中调用的正常模型方法与您有关联时调用的方法略有不同。例如,我的关联在创建Controller操作时运行良好:@user=current_user@building=Building.new(params[:building])respond_todo|format|if@user.buildings.create(params[:building])#etcetera但我找不到关于更新如何工作的文档:@user
升级到OSXYosemite后,我现有的pow.cx安装不起作用。升级到最新的pow.cx无效。通过事件监视器重新启动它也没有成功。 最佳答案 卸载(!)并重新安装解决了这个问题。curlget.pow.cx/uninstall.sh|shcurlget.pow.cx|sh 关于ruby-on-rails-OSXYosemite更新破坏了pow.cx,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/q
我们在Ubuntu14.04和Gitlab9.3.7上运行,运行良好。我们正在尝试更新到Gitlabv9.3.8的最新安全补丁,但它给我们这个错误:Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension.currentdirectory:/home/git/gitlab/vendor/bundle/ruby/2.3.0/gems/re2-1.0.0/ext/re2/usr/local/bin/ruby-r./siteconf20170720-19622-15i0edf.rbextconf.rbcheckingformain(
我正在尝试使用Sinatra中的重定向和session在网站周围传递一些数据。这是一个简化的示例,使用PrettyPrint进行调试:require'pp'require'rubygems'require'sinatra'enable:sessionsget'/'dosession[:foo]='12345'puts'session1'ppsessionredirectto('/redir')endget'/redir'doputs'session2'ppsession'helloworld'end查看Thin的输出,我看到:>>Listeningon0.0.0.0:4567,CTRL
我遇到了以下问题。我有一个名为user的模型,它有一个名为activated的列。我试图通过激活的方法更新该值?但它给我错误:验证失败:密码不能为空,密码太短(最少6个字符)这对我来说没有意义,因为我没有接触密码字段!我只想更新激活的列。我把我认为相关的代码放在这里,但如果你认为你需要更多,请问:)非常感谢您!型号:attr_accessor:passwordattr_accessible:name,:email,:password,:password_confirmation,:activatedhas_many:sucu_votesemail_regex=/\A[\w+\-.]+@