C# Blazor-一个组件应该对另一个组件的方法作出反应
我用它来快速翻译HTML中的文本,只要我写一个像C# Blazor-一个组件应该对另一个组件的方法作出反应,c#,html,razor,blazor,C#,Html,Razor,Blazor,我用它来快速翻译HTML中的文本,只要我写一个像@MyText.Example这样的标记,它就可以正常工作。但是,如果我尝试对列表(参见我的footelayout.razor)执行相同的操作,则会有点不同。当我更改我的NaviHeaderBar中的值时,列表必须在FooterLayout中更改 我的主布局.razor如下所示: <div class="grid grid-cols-1" style="width: 100%;"> <
@MyText.Example这样的标记,它就可以正常工作。但是,如果我尝试对列表
(参见我的footelayout.razor
)执行相同的操作,则会有点不同。当我更改我的NaviHeaderBar
中的值时,列表必须在FooterLayout
中更改
我的主布局.razor如下所示:
<div class="grid grid-cols-1" style="width: 100%;">
<div class="grid-c-1 grid-r-1">
<NaviHeaderBar />
</div>
<div class="grid-c-1 grid-r-1">
<LoginDisplay />
</div>
<div class="grid-c-1 grid-r-1">
@Body
</div>
<div class="grid-c-1 grid-r-1">
<FooterLayout />
</div>
</div>
现在,当我更改语言设置时,我的FooterLayout.razor
不会更改它的文本。我可以让它改变它的文本,例如@onmouseover
。但这意味着我必须将鼠标悬停在我的页脚布局上
当我在NaviHeaderBar
中更改语言设置时,是否有办法正确更改其文本?我该怎么做?您需要某种状态管理(如Fluxor)或某种消息传递系统
public class MessagingSystem
{
public event EventHandler<EventArgs> LanguageChanged;
public void NotifyLanguageChanged()
{
LanguageChanged?.Invoke(this, EventArgs.Empty);
}
}
公共类消息系统
{
公共事件处理程序语言已更改;
public void NotifyLanguageChanged()
{
LanguageChanged?.Invoke(此为EventArgs.Empty);
}
}
然后,您可以将其插入到标题中,并在选择新语言时调用NotifyLanguageChanged
在页脚中,您可以插入它,然后订阅LanguageChanged
,并在该事件中调用InvokeAsync(statehaschange)代码>
但是请记住,如果您使用标准的.NET事件,则必须在组件上实现IDisposable
,以便您也可以取消订阅,否则服务将永远保留对组件的引用,并且不会对其进行垃圾收集
就个人而言,我只会使用Fluxor:)
@code
{
private string CurrentLang;
I18nText.NaviHeaderBarLanguage MyText = new I18nText.NaviHeaderBarLanguage();
protected override async Task OnInitializedAsync()
{
MyText = await I18nText.GetTextTableAsync<I18nText.NaviHeaderBarLanguage>(this);
}
private async Task OnChangeCurrentLang(ChangeEventArgs args)
{
CurrentLang = args.Value as string;
await I18nText.SetCurrentLanguageAsync(CurrentLang);
}
}
@foreach (LinkInput link in linkListInput)
{
<a href=@link.linkURl style="height: 30px; line-height: 20px;">
<li class="list-item">@link.text</li>
</a>
}
</ul>
</div>
@code{
public List<LinkInput> linkListInput = new List<LinkInput>(){
new LinkInput("text1", "/url1/"),
new LinkInput("text2", "/url1/"),
new LinkInput("text3", "/url1/"),
new LinkInput("text4", "/url1/"),
new LinkInput("text5", "/url1/")
};
I18nText.FooterLayoutLanguage MyText = new I18nText.FooterLayoutLanguage();
protected override async Task OnInitializedAsync()
{
MyText = await I18nText.GetTextTableAsync<I18nText.FooterLayoutLanguage>(this);
}
}
protected override async Task OnInitializedAsync()
{
MyText = await I18nText.GetTextTableAsync<I18nText.FooterLayoutLanguage>(this);
linkListInput.Clear();
linkListInput.Add(new LinkInput(MyText.Example, "/url1"));
linkListInput.Add(new LinkInput(MyText.Example, "/url1"));
linkListInput.Add(new LinkInput(MyText.Example, "/url1"));
linkListInput.Add(new LinkInput(MyText.Example, "/url1"));
linkListInput.Add(new LinkInput(MyText.Example, "/url1"));
StateHasChanged();
}
public class MessagingSystem
{
public event EventHandler<EventArgs> LanguageChanged;
public void NotifyLanguageChanged()
{
LanguageChanged?.Invoke(this, EventArgs.Empty);
}
}