说一个叫做cinput.cshtml的子组件是
<input type="text" bind="@username">
@functions{
string username;
}
和称为pform.cshtml的父组件
<cinput></cinput>
<input type="text" bind="@email">
<input type="button" onclick="@onsubmit">
@functions{
string email;
public void onsubmit(){
//Call api
}
}
所以问题是如何在父组件中获取用户名值?
答案 0 :(得分:1)
您应该执行以下操作:
[Parameter] protected EventCallback<string> OnUserNameChanged { get; set; }
此属性将包含对在父组件上定义的方法的委托。
private string username;
public string UserName
{
get => username;
set
{
username = value;
// Invoke the delegate passing it the changed value
OnUserNameChanged?.Invoke(value);
}
}
public async void UserNameChanged(string username)
{
// Gets and consume the user name
}
<cinput OnUserNameChanged="UserNameChanged" ></cinput>
<input type="text" bind="@email">
<input type="button" onclick="@onsubmit">
希望这对您有帮助...
这是史蒂夫·安德森(Steve Anderson)关于裁判的话:
用例
预期的用例是允许父组件向子组件发出命令,例如“显示”或“重置”。
即使如此,从结构上讲,这也是一个折衷方案,因为子组件保持无状态(即,除了其参数外不作用于其他任何状态)会更干净,在这种情况下,它不是甚至从理论上讲,除了更改孩子的参数外,发出一个“动作”是有意义的,在这种情况下,您根本不需要引用。
强烈不建议,您将ref用作改变子组件状态的一种方式。相反,请始终使用常规的声明性参数将数据传递给子组件。这将导致子组件在正确的时间自动重新渲染。我们正在朝着改变组件上参数的表示方式迈进,以便默认情况下将它们封装起来,并且无法从外部进行读取/写入。
答案 1 :(得分:-1)
您直接需要的是类似ref
参数的东西。不支持afaik。
当您要编写表格时,它可能是这样的:
1)将可变类型添加到您的项目中。 System.String
是不可变的,因此我们需要:
public class StringWrapper
{
public string Value { get; set; }
}
2)将其作为参数添加到cinput:
<input type="text" bind="@username.Value" />
@functions{
[Parameter]
StringWrapper username { get; set; }
}
3)然后,顶层表单可以公开一个cinput可以更改的包装器:
<cinput username="@userName"></cinput>
@functions{
StringWrapper userName = new StringWrapper { Value = "John Doe" };
string email;
public void onsubmit()
{
//Call api with userName.Value
}
}
答案 2 :(得分:-2)
所以我做了这样的事情
cinput.cshtml
Expired
在pform.cshtml
<input type="text" bind="@username">
@functions{
string username;
string getUsername(){
return username;
}
}