我正在尝试使用 vue3 和 ref 方法访问父组件中的子方法。但它返回一个错误。
未捕获的类型错误:addNewPaper.value?.savePaper 不是函数
下面是我的代码。请指导我哪里错了。
子组件
<script setup lang="ts">
import { useWindowScroll } from '@vueuse/core'
import { Notyf } from 'notyf'
import { computed, defineProps, reactive, ref } from 'vue'
import { papers } from '/@src/firebase/connections'
const companySize = ref('')
const businessType = ref('')
const productToDemo = ref('')
const date = ref(new Date())
const { y } = useWindowScroll()
const isStuck = computed(() => {
return y.value > 30
})
const initialState = reactive({
subject: '',
paper: …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试传递一个引用来获取提交时的输入(基本输入组件)的值。您将在下面找到这两个组件。对于handleSubmit 中的console.log,电子邮件始终是未定义的。
在此先感谢您的帮助。
父组件
<template>
<form @submit.prevent="handleSubmit">
<div class="flex flex-col mt-10">
<form-label forInput="email" label="Email Address" />
<base-input type="email" name="email" ref="email" />
</div>
</form>
</template>
<script>
import BaseInput from "../UI/BaseInput.vue";
export default {
components: {
BaseInput,
},
methods: {
handleSubmit() {
const email = this.$refs.email.value;
console.log(email);
},
},
};
</script>
Run Code Online (Sandbox Code Playgroud)
子输入组件
<template>
<input
:type="type"
:name="name"
:ref="name"
/>
</template>
<script>
export default {
props: ["type", "name"],
};
</script>
Run Code Online (Sandbox Code Playgroud) 我有一个具有以下结构的对象:(伪代码)
class Client
{
- int ID
- int? ParentID
- string Name
- datetime CreateDate
- int ACClientID
- List <Client> Clients }
Run Code Online (Sandbox Code Playgroud)
我想使用递归foreach遍历整个嵌套结构,将ALL的ACClientID设置为一个值.
我知道foreach中的枚举器是不可变的,因此以下不起作用:
private static bool AssignToChildren(ref ATBusiness.Objects.Client client, int ACClientID)
{
client.ACClientID = ACClientID;
foreach (ATBusiness.Objects.Client child in client.Clients)
{
AssignToChildren(ref child, ACClientID);
}
}
Run Code Online (Sandbox Code Playgroud)
实现目标的最有效方法是什么?
PS:我不会在结构中添加或删除,只是为每个嵌套的Client对象设置一个属性.
[编辑]我看过在'foreach'循环中修改列表的最佳方法是什么?但它没有为我提供我需要的答案.
我用WPF编写我的界面.我使用ListView作为我的任务列表.任务列表包含两列,FileName,Progress.every绑定到TaskInfo的行:
public class TaskInfo : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public TaskInfo(string fp)
{
FileSystemInfo fsi= new DirectoryInfo(fp);
FileName = fsi.Name;
FilePath = fp;
PbValue = 0;
}
private int pbvalue;
public int PbValue
{
get { return pbvalue; }
set
{
pbvalue = value;
onPropertyChanged("PbValue");
}
}
private string filename;
public string FileName
{
get { return filename;}
set
{
filename = value;
onPropertyChanged("FileName");
}
}
private string filepath;
public string FilePath
{
get { return filepath;}
set …Run Code Online (Sandbox Code Playgroud) 查看下面的代码并告诉我为什么在调用函数UpdateContext之后,变量connection2没有与变量connection1相同的哈希码.
当我将变量connection2设置为connection1时,两个变量都有一个指向相同内存地址的指针.但是在函数UpdateContext中通过ref传递变量connection1后,使用'new'指令修改指针,connection1有一个新的指针地址,但connection2仍然是旧地址.
class Program
{
static void Main(string[] args)
{
var connectionInitializer = new ConnectionInitializer();
connectionInitializer.Initialize();
Console.ReadLine();
}
}
public class Connection
{
}
public class ConnectionInitializer
{
public void Initialize()
{
var connection1 = new Connection();
var connection2 = connection1;
Console.WriteLine("Connection 1 (Before ref): " + connection1.GetHashCode());
Console.WriteLine("Connection 2 (Before ref): " + connection2.GetHashCode());
this.UpdateContext(ref connection1);
Console.WriteLine("Connection 1 (After ref): " + connection1.GetHashCode());
Console.WriteLine("Connection 2 (After ref): " + connection2.GetHashCode());
}
private void UpdateContext(ref Connection connection)
{
connection = …Run Code Online (Sandbox Code Playgroud) 我试图将一个xna游戏中的对象传递给我正在编写的xna游戏库中的方法.该对象基本上可以是任何类型,包括引用和值类型.
游戏库用于调试目的,应该向屏幕打印传入的对象的当前值.它目前通过调用ToString对象来执行此操作,但将来字符串将根据基础类型进行格式化.
这是接收参数的游戏库方法
public void AddToDebug(object obj)
{
var type = obj.GetType();
_debugTypes.Add(obj, type);
}
Run Code Online (Sandbox Code Playgroud)
以下是在主游戏项目中使用它的示例
VD.AddToDebug(_counter);
VD.AddToDebug(_message);
Run Code Online (Sandbox Code Playgroud)
_counter是一个int并且_message是一个字符串.
问题是这些值的变化不会反映在屏幕上,因为(我假设)它们是按值传递的,而不是通过引用传递的.
我尝试添加ref关键字以确保它们通过引用传递,但这会导致方法调用出错 The ref argument type does not match parameter type
有没有办法可以通过引用传递值类型而不必指定实际类型(如果我可以避免它,我不想为所有值类型创建方法重载).
任何其他建议也欢迎.谢谢
UPDATE
尝试几种不同的方法后,我最终决定采用传递一个简单的方法Func<T>进入AddToDebug方法如下所示.我意识到,至少在目前,我不需要基础值,只需要格式化字符串表示.
将来我可以扩展库以自动扫描传入的类型并显示其所有成员的值.如果是这样的话,我可能会使用@Hans Passant的建议来传递对相关课程的引用.
这就是说我会接受@Lee的答案,因为它在我的最终实现中最有用,建议使用Func.
这是我现在的代码,欢迎任何改进建议.感谢大家的帮助.
public void AddToDebug<T>(Func<T> getValue, Color? color = null)
{
var w = new DebugEntry<T>(getValue, color.HasValue ? color.Value : Color.White);
_values.Add(w);
}
public class DebugEntry<T> : IStringFormatter
{
private readonly Func<T> _getValue; …Run Code Online (Sandbox Code Playgroud) 我在一个循环中启动4个线程.每个线程获取一个数组元素的引用来写入结果.
但是在我创建每个线程的行上,我得到了一个System.IndexOutOfRangeException.我很惊讶索引"i"超出了范围.
这是一个例子:
void ThreadsStarter()
{
double[] data = new double[4];
for(int i = 0; i < 4; i++)
{
Thread my_thread = new Thread(() => Work(data[i]));
my_thread.Start();
}
}
void Work(double data)
{
}
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
背景是在NHibernate映射中,因为集合字段在基类中声明并在运行时动态代理.
由于有一些代理类需要在编码期间引用集合字段,因此,当NHiberate使用自己的集合实例重新分配字段时,代理会丢失引用.
尝试使用ref"跟踪"参考,但未通过结果.
有些专家可以帮助解释C#ref关键字和NHiberate集合代理(如果有的话)的根本原因.
谢谢.
class Program
{
static void Main(string[] args)
{
var v = new D();
}
}
class A
{
}
class B : A
{
}
class C
{
public A a = new A();
public Proxy p;
public C()
{
p = new Proxy(ref a);
p.Out();
}
}
class D : C
{
public D()
{
a = new B();
Console.WriteLine(a.GetType().Name);
p.Out();
}
}
class Proxy
{
public A a;
public Proxy(ref A …Run Code Online (Sandbox Code Playgroud) 是否可以通过Ref传递参考类型(Class)的自动属性的变通方法?
我唯一想到的就是不要使用自动属性:只需要像往常一样声明私有变量并通过ref传递它,如果需要的话,将公共属性添加到一边.
坦率地说,它看起来有点愚蠢(所有官僚机构都需要绕过它)
我的问题:1.
为什么编译器不允许自动属性被ref传递(就像它是一个简单的数据成员)?2.什么时候使用或应该使用Ref?我注意到有人说使用它可能只在极少数情况下才会发生.他们是什么?
我想我明白这里发生了什么,但我真的很感激有人说明为什么会发生这种情况.
基本上,(我的编码在飞行这里,给尽可能简单的图示)我有一个S类,除其他事项外,保持与名字的类的对象符号表.所以,我在课堂上定义:
static member (names:Map<string,S> ref) = ref Map.empty
Run Code Online (Sandbox Code Playgroud)
......然后,在S中,我定义:
member this.addSymbol (table: Map<string,S> ref) (name:string)
table := (!table).Add(name, this)
this
Run Code Online (Sandbox Code Playgroud)
我从其他地方称呼这个,因此:
ignore (s.addSymbol S.names "newname")
...
Run Code Online (Sandbox Code Playgroud)
在S.addSymbol里面,我可以看到新的键/值被添加到表中,但是S.names没有得到更新.相反,如果我这样调用addSymbol:
ignore (
let tmp = S.names
s.addSymbol tmp "newName"
)
Run Code Online (Sandbox Code Playgroud)
然后我可以看到tmp正在使用新的键/值对进行更新,但是S.names仍然没有得到更新.
这就是我认为我所知道的:ref机制没有任何问题 - 它在函数内部和外部正确地更新了指示对象.但是静态成员似乎有些奇怪 - 就像,每次都只是递给我相同的静态引用',它复制'a然后为此创建一个新的引用.
我做对了吗?如果是这样,为什么要这样做呢?我能做些什么来让它表现得更明智?
提前致谢.
ref ×10
c# ×7
javascript ×2
vue.js ×2
arrays ×1
constructor ×1
f# ×1
foreach ×1
nhibernate ×1
properties ×1
reference ×1
reflection ×1
typescript ×1
vuejs3 ×1